Boa tarde pessoal, estou a dias ralando para utilizar JPA 2, JSF 2 no Glassfish V3. O problema é acredito que estou fazendo de forma errada a utilizacao do JPA. A injeção do meu DAO funcionava somente na primeira página, para tratar isso criei um managedbean com escopo de aplicação, dentro dele coloquei meu dao:
@Named(value="aplicacao")
@ApplicationScoped
public class Aplicacao implements Serializable{
public static final long serialVersionUID = 5L;
@Inject
private DaoUsuario daoUsuario;
public static Aplicacao getAplicacao(){
Aplicacao aplicacao = null;
try{
FacesContext fc = FacesContext.getCurrentInstance();
aplicacao = (Aplicacao) fc.getApplication().getExpressionFactory().createValueExpression(fc.getELContext(),"#{aplicacao}", Aplicacao.class).getValue(fc.getELContext());
}catch(Exception ex){
ex.printStackTrace();
}
return aplicacao;
}
/** Creates a new instance of Aplicacao */
public Aplicacao() {
}
/**
* @return the daoUsuario
*/
public DaoUsuario getDaoUsuario() {
return daoUsuario;
}
/**
* @param daoUsuario the daoUsuario to set
*/
public void setDaoUsuario(DaoUsuario daoUsuario) {
this.daoUsuario = daoUsuario;
}
}
Acredito, ou tenho quase certeza, que isso não passa de uma gambiarra, e, claro, tá chovendo “session is Closed !” e LazyInitializationException.
Alguém poderia me dar uma dica de implementar corretamente este Dao’s ?
Dá uma olhada no código da sua classe DaoUsuario, pois o problema tá acontecendo lá. Não acredito que seja relacionado ao seu ManagedBean. Porque está usando escopo de Aplicação?
O escopo de aplicação sei que é errado, mas é o único que tem funcionado depois de eu passar pela primeira view. To estudando agora o @Dependent, mas o entityManager parece não estar sendo injetado mesmo usando: @PersistenceContext(type=PersistenceContextType.EXTENDED). exemplos:
@Named("usuario")
@SessionScoped
public class UsuarioMB implements Serializable{
public static final long serialVersionUID = 5L;
private String[] secoes = {"registro", "ficha", "gerenciamento", "emprego"};
private String secao;
private Usuario usuarioLogado;
private String cpf;
private String senha;
@Inject
private UsuarioFacade usuarioFacade;
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
private String busca;
private Usuario usuarioSelecionado;
private boolean novoUsuario;
private StreamedContent imagem;
//getters e setters
UsuarioFacade:
@PermitAll
@Dependent
public class UsuarioFacade implements Serializable{
public static final long serialVersionUID = 5L;
@Inject
private Aplicacao aplicacao;
Aplicacao:
@Named(value="aplicacao")
@Dependent
public class Aplicacao implements Serializable{
public static final long serialVersionUID = 5L;
@Inject
private DaoUsuario daoUsuario;
@PersistenceContext(type=PersistenceContextType.EXTENDED)
private EntityManager entityManager;
ainda assim não sei o que está errado, parece que ele não realiza o @PersistenceContext(type=PersistenceContextType.EXTENDED), pois
eh… tô descabelando…
É complicado descobrir o erro assim. A injeção do EntityManager já funcionou alguma vez ou nunca funcionou? Foi a partir de alguma alteração no código que deixou de funcionar? Se nunca funcionou, crie um novo projeto pra teste e simplifique, crie novamente a classe DAO e faça um acesso simples ao entitymanager, sem criar o resto das classes. Depois vá recriando passo a passo o projeto e a cada alteração gere um build (olha aí a integração contínua) e teste. Crie testes unitários e a cada alteração no código rode tudo aí você consegue descobrir o que fez quebrar.