CDI Beans 和 Hibernate Envers

Mar*_*lho 2 cdi hibernate-envers

我开始使用 Hibernate Envers。我已经能够使用 @Audited 正确注释类并创建修订版,但我无法用我的修订版记录已记录的用户数据。

我的 JSF 2.0 测试应用程序在 jbossEAP6/wildfly 服务器中的 CDI、JPA/Hibernate 上运行。我既不使用 Spring 也不使用 Seam。

这是一些代码:

修订实体.java

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

    @RevisionTimestamp
    private long timestamp;

    private String username;
Run Code Online (Sandbox Code Playgroud)

登录Bean.java

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

private String username;
...
Run Code Online (Sandbox Code Playgroud)

审计监听器

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());

        }
Run Code Online (Sandbox Code Playgroud)

loginBean 注入失败,给我一个 NullPointerException。有任何想法吗?

抱歉我糟糕的语法。

问候,马塞洛。

小智 5

侦听器不受容器管理,因此您的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);
Run Code Online (Sandbox Code Playgroud)