CDI Beans和Hibernate Envers

时间:2016-02-25 03:24:49

标签: cdi hibernate-envers

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

我的JSF 2.0测试应用程序在jbossEAP6 / wildfly服务器上的CDI,JPA / Hibernate上运行。我既不使用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。有什么想法吗?

对我糟糕的语法表示抱歉。

此致 马塞洛。

2 个答案:

答案 0 :(得分:3)

侦听器不受容器管理,因此不会注入 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);

答案 1 :(得分:0)

你没有给出任何堆栈跟踪,所以我猜。 AFAIK你不能把两者结合在一起

@Stateful
@SessionScoped

因为第一个注释用于使类成为EJB有状态会话bean,但第二个注释用于使类成为CDI托管bean,范围为Session

在我看来,你正在尝试使用你根本不了解的技术。请阅读规范或至少一些CDI教程/示例GitHub项目。

个人建议:大多数情况下,您宁愿使用@Stateless而不是@Stateful来获取EJB bean。然后,您可以存储与HTTP会话相关的所有数据,例如在一些额外的@SessionScoped CDI bean中。