2016-02-25 6 views
1

Я начинаю с Hibernate Envers. Я уже умею правильно комментировать классы с помощью @Audited и создавать ревизии, но я не могу записывать зарегистрированные данные пользователя с моими ревизиями.CDI Beans и Hibernate Envers

Приложение для тестирования JSF 2.0 работает на CDI, JPA/Hibernate на сервере jbossEAP6/wildfly. Я не использую Spring или Seam.

Вот код:

revisionEntity.java

@Entity 
@RevisionEntity(AuditListener.class) 
public class RevisionEntity { 
    @Id 
    @GeneratedValue 
    @RevisionNumber 
    private int id; 

    @RevisionTimestamp 
    private long timestamp; 

    private String username; 

LoginBean.java

@Named 
@Stateful 
@SessionScoped 
public class LoginBean implements Serializable{ 

private String username; 
... 

AuditListener.java

import javax.ejb.Stateful; 
import javax.enterprise.context.SessionScoped; 
import javax.inject.Inject; 
import javax.inject.Named; 

import org.hibernate.envers.RevisionListener; 

import br.test.login.filterlogin.beans.LoginBean; 

    @Named 
    @Stateful 
    @SessionScoped 
    public class AuditListener implements RevisionListener { 

     @Inject 
     private LoginBean loginBean; 

     public void newRevision(Object revisionEntity) { 

      RevisionEntityEx RevEntity = (RevisionEntityEx) revisionEntity; 
      RevEntity.setUsername(loginBean.getUsername()); 

     } 

Инъекция loginBean терпит неудачу, что дает мне NullPointerException. Есть идеи?

Извините за мою страшную грамматику.

С уважением, Марсело.

ответ

0

Вы не указали какой-либо stacktrace, поэтому я предполагаю. AFAIK вы не можете объединить вместе как

@Stateful 
@SessionScoped 

Поскольку первый аннотаций для создания класса EJB-компонент сессионного компонента, но вторые один для создания класса А КДИ управляемого компонента, с размахом Session.

Мне кажется, что вы пытаетесь использовать технологии, которые вы вообще не понимаете. Пожалуйста, прочитайте спецификацию или, по крайней мере, некоторые учебники CDI/примеры проектов GitHub.

Личные советы: большую часть времени вы должны предпочесть использовать @Stateless над @Stateful для EJB-бобов. Затем все данные, относящиеся к сеансу HTTP, которые вы можете сохранить, например. в некоторых дополнительных @SessionScoped CDI bean.

1

Слушатель не управляется контейнером, поэтому ваш loginBean не будет вводиться.

Нам нужно для поиска этого ...

Обратите внимание, чтоUsuarioService должен быть изменен на тип: LoginBean.

import javax.enterprise.context.spi.CreationalContext; 
import javax.enterprise.inject.spi.Bean; 
import javax.enterprise.inject.spi.BeanManager; 
import javax.enterprise.inject.spi.CDI; 

BeanManager beanManager = CDI.current().getBeanManager(); 
Bean<UsuarioService> bean = (Bean<UsuarioService>) beanManager.getBeans(UsuarioService.class).iterator().next(); 
CreationalContext<UsuarioService> context = beanManager.createCreationalContext(bean); 
this.usuarioService = (UsuarioService) beanManager.getReference(bean, UsuarioService.class, context);