Integrar JPA 2 Glassfish 3 sem Spring

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.