【问题标题】:CDI Beans and Hibernate EnversCDI Beans 和 Hibernate Envers
【发布时间】:2016-02-25 03:24:49
【问题描述】:

我开始使用 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。有什么想法吗?

对不起我糟糕的语法。

问候, 马塞洛。

【问题讨论】:

    标签: cdi hibernate-envers


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

      你没有提供任何堆栈跟踪,所以我猜。 AFAIK,您不能将两者结合在一起

      @Stateful
      @SessionScoped
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-28
        • 2019-07-28
        • 1970-01-01
        • 2011-07-12
        • 2023-03-24
        相关资源
        最近更新 更多