Preciso fazer auditoria do meu sistema. Optei por usar os Callbacks do JPA, @PostLoad, @PostPersist, etc. O que está acontecendo é que ao interceptar algum evento, quando preciso fazer um Select, ou tentar persistir alguma coisa, dentro dos meu método que monitoram os eventos, eu levo um nullpointer na fussa.
O meu interesse é o seguinte: Após o usuário realizar alguma ação, seja cadastrar, deletar ou editar … eu tenho q armazenar o que ele fez, os dados que foram adicionados, ou alterados ou deletados.
A minha classe listener intercepta as ações corretamente, mas quando preciso fazer alguma transação com a base de dados dentro dos métodos anotados, acontece a exceção no meu método logar da minha classe Managed Bean onde gerencio essa parte de login do Sistema
Estou monitorando minha Entidade Login. Quando inicio o sistema, o usuario faz login via Managed Bean, e paralelamente há essa interceptação de evento na Entidade Login via minha classe Listener.
Vou postar minha classe Listener:
@Stateless
public class LogSistemaListener implements Serializable{
private LogSistemaGeral logSistema;
private DataHora dataHora;
@EJB
private LogSistemaGeralFacadeLocal logDao;
@EJB
private PersisteLog persistir;
@EJB
private Sessao sessao;
public LogSistemaListener() {
logSistema = new LogSistemaGeral();
dataHora = new DataHora();
}
// Método utilizado para monitorar a entidade logo após a inserção
@PostPersist
void monitorLogAcao(Object entidade) {
if (entidade.getClass().getSimpleName().equals("Pivo")){
// aqui veria a parte de inserção na tabela do banco
}
}
//Método utilizado para monitorar o login no sistema
@PostLoad
void monitorLogInicial(Object entidade) {
if (entidade.getClass().getSimpleName().equals("Login")) {
Login obj = (Login) entidade;
logSistema.setDataLog(dataHora.dataSistema());
logSistema.setHoraEntrada(dataHora.horaSistema());
logSistema.setUsuario(obj.getNome());
logDao.create(logSistema);
}
}
}
[quote=Hebert Coelho]Até onde eu sei, callback do JPA na versão 2.1 não tem suporte a injeção.
Ele ta dando nullpointer é no acesso a um EJB?[/quote]
Pior que é cara. Observando aqui, tirei as injeções e botei new para criar a instancia e funciou. Mas ainda tem o problema na hora de persistir um objeto dentro do método. Ainda estou recebendo um nullpointer. Eu tinha pensado em pegar o objeto com os dados, inserir na seção e persistir em outro local, o que acha ?.
Eu não sabia que callback do JPA não tinha suporte a Injeção. Estou estudando o livro que você me indicou “Interprise Java Beans 3.0”, e nele não fala sobre esse detalhe.
Hebert, eu to jogando na sessao e recuperando em outro objeto pra persistir e fazer da forma que quero. Tentei resolver de todas as formas possíveis, mas so tenho um nullpointer como resposta.
Vou fazer isso momentaneamente, porque preciso terminar essa funcionalidade, mas posteriormente irei corrigir isso e fazer de forma mais elegante !!!
Se você souber o que pode esta ocorrendo, ou algum outro colega souber, por favor, me dê um toque.
[quote=Hebert Coelho]Eu suspeitei disso por causa da palestra que estou preparando para a JUDCon.
Olha o que achei no blog da oracle sobre a nova versão do JPA:
Por isso que você toma null.
Faça um lookup que você vai conseguir persistir.[/quote]
Puts cara, olha minha falta de atenção. Estou usando EclipseLink com JPA 2.0. Vou ter que baixar com a versão 2.1 e fazer o teste. Qual provedor de persistencia você costuma usar Hebert ?
[quote=Frapout]Não estou conseguindo achar a biblioteca de persistência com a jpa 2.1 para baixar. Sabe de algum link Hebert ?[/quote]Nem foi lançada ainda. Eu vi no maven uma versão não oficial do hibernate. [=
[quote=Hebert Coelho][quote=Frapout]Não estou conseguindo achar a biblioteca de persistência com a jpa 2.1 para baixar. Sabe de algum link Hebert ?[/quote]Nem foi lançada ainda. Eu vi no maven uma versão não oficial do hibernate. [=
Mas nem tenho o link mais aqui.[/quote]
Vou dar uma procurada cara … e muito obrigado pelas dicas !!
Assim que eu conseguir, post aqui o resultado dos meus testes.