当前位置: 首页 > 面试题库 >

EntityListeners中的CDI注入

鄢选
2023-03-14
问题内容

由于JPA 2.0不支持注入EntityListener(将使用JPA
2.1),因此决定使用JNDI查找来获取,BeanManager并通过它来获取登录用户。我定义了一个EntityListener与此类似的东西:

public class MyEntityListener {

    public static BeanManager getBeanManager() {
        try {
            InitialContext initialContext = new InitialContext();
            return (BeanManager) initialContext.lookup("java:comp/BeanManager");
        } catch (NamingException e) {
            e.printStackTrace();
            return null;
        }
    }

    public Object getBeanByName(String name) {
        BeanManager bm = getBeanManager();
        Bean bean = bm.getBeans(name).iterator().next();
        CreationalContext ctx = bm.createCreationalContext(bean);
        return bm.getReference(bean, bean.getClass(), ctx);
    }

    @PrePersist
    @PreUpdate
    public void onPreInsertOrUpdate(MyEntity entity) {
        User loggedInUser = (User) getBeanByName("loggedInUser");
        entity.setUpdatedUser(loggedInUser);
        entity.setUpdatedTimestamp(new Date());
    }
}

在会话范围内以以下方式管理用户:

@SessionScoped
public class UserManager implements Serializable {

    private User loggedInUser;

    @Produces
    @Named("loggedInUser")
    public User getLoggedInUser() {
        return loggedInUser;
    }

    // Set the logged in user after successfully login action
}

我想知道这种方法有什么缺点或要注意的地方。性能吞吐量?当有多个登录用户在其自己的范围内同时更新实体时,会发生什么情况?
Hibernate JPA 2.0
缝焊CDI
Glassfish 3.1.2


问题答案:

您的方法是正确的。

性能吞吐量?

恕我直言,无需担心-JPA 2.1将使用等效的机制。但是请确保编写一个切实可行的测试,以确保安全。

当有多个登录用户在其自己的范围内同时更新实体时,会发生什么情况?

所有(非依赖范围的)bean引用都在内部进行代理。底层的CDI实现必须保证正确的分辨率。



 类似资料:
  • 免责声明:我刚刚开始使用OSGI,所以请忍受我和我的知识不足... 为了本练习,假设我有一个基于泽西岛 (2.17.0) 的 REST 应用程序在 OSGI 环境中的 Jetty (9.2.10) 下运行,它为用户提供了一些通过 SOAP 从单独的服务器收集的统计信息。 我现在尝试在另一个应用程序中重用一些现有代码,该应用程序应该通过JMS(或其他东西)检索统计信息。 我的目的是在捆绑包中为客户端

  • 问题内容: 当前,我正在使用PersistenceContext注入EntityManager。EM被完美注入。 现在,我尝试装饰Bean,然后突然没有注入em。我得到一个NullPointerException。 我知道EJB和CDI是2个完全不同的管理器,所以一个都不知道另一个。我期望@PersistenceContext是EJB注入点,而@Inject是CDI。我应该怎么做才能解决这个问题并

  • 我有一个JAR文件,其中包含一个请求范围Bean。(一个注释为的类)。 我有另一个Web服务项目(作为WAR文件构建)。上述JAR文件位于WAR文件的文件夹中。 我试图的类到Web服务项目中的一个类中。 我正在得到一个 这两个项目都有JAR文件,WAR文件包含一个空的。我已经研究这个问题好几天了。请帮忙。 谢谢

  • 我有一个超类型(CaseDTO),其中有几个子类型(GroupCaseDTO,IPCaseDTO),我想注入。开发环境是JDev 12c。 以下是两个注射点: > @将@CaseContext private CaseDTO muwCase注入; 注入特定子类型(此注入点仅适用于一个子类型): @将@CaseContext private GroupCaseDTO muwCase注入; 为了获得这

  • CDI到达以执行类的构造函数。但是,请求字段未初始化(注入)。 我做错了什么?

  • 我有一个有状态的会话作用域(CDI)EJB,它保存有关用户会话的信息。 现在,我想从一个 我从webapp直接访问EJB(使用注入)到我为JSF使用的bean中(它们也是CDI管理的bean)。 我面临的问题是,似乎与JSF bean处于不同的“会话范围”。创建了两个实例;一个从JSF实例化,另一个从HttpSessionListener实例化。 我尝试通过注入实例注入bean 这个bug报告建议