【问题标题】:Java-EE-6 / Glassfish: How to access Entity Manager from Custom Audit Module?Java-EE-6 / Glassfish:如何从自定义审计模块访问实体管理器?
【发布时间】:2013-02-20 06:13:45
【问题描述】:

我正在使用 Glassfish 3.1.2.2,我想收集身份验证信息并将其存储到连接到 Glassfish 应用程序服务器的 MySQL 数据库中。到目前为止,我成功实现了一个定制的审计模块,并将其放入我的 ejb 项目中。到目前为止,这没有问题。

现在我想在登录尝试失败时设置一些标志和计数器。为此,我尝试将 EntityManager 实例注入到 AuditModule 类/对象中,但这总是会引发空指针异常,因为注入失败。

我已经尝试添加@Stateless 注释(为了告诉这个类应该是容器管理的),但没有成功。实体管理器实例“em”仍然为空。

这是我定制的审计模块:

@Stateless
public class CustomAuditModule extends AuditModule {

    @PersistenceContext(unitName = "MyPersistenceUnit-ejbPU")
    private EntityManager em;

    @Override
    public void init(Properties props) {
        this.props = props;
    }

    @Override
    public void authentication(String username, String realm, boolean success) {
        if(success) {
            try {
                User user = em.createQuery("SELECT u FROM User u WHERE u.name='"+username+"'", User.class).getSingleResult();
                user.setLastLoginFail(new Long(-1L));
                user.setLoginFails(0);
                em.merge(user);
                em.flush();
            } catch(NoResultException ex) {
                Logger.getLogger(CustomAuditModule.class.getName()).log(Level.WARNING, "User "+username+" does not exist.");
            }
        } else {
            try {
                User user = em.createQuery("SELECT u FROM User u WHERE u.name='"+username+"'", User.class).getSingleResult();
                user.setLastLoginFail(System.currentTimeMillis());
                int fails = user.getLoginFails().intValue();
                fails++;
                user.setLoginFails(fails);
                em.merge(user);
                em.flush();
            } catch(NoResultException ex) {
                Logger.getLogger(CustomAuditModule.class.getName()).log(Level.WARNING, "User "+username+" does not exist.");
            }
        }
    }

    @Override
    public void ejbInvocation(String user, String ejb, String method, boolean success) {
        Logger.getLogger(CustomAuditModule.class.getName()).log(Level.INFO, "EJB Invocation.");
    }

    @Override
    public void serverStarted() {
        Logger.getLogger(CustomAuditModule.class.getName()).log(Level.INFO, "Server Started.");
    }

    @Override
    public void serverShutdown() {
        Logger.getLogger(CustomAuditModule.class.getName()).log(Level.INFO, "Server Shutdown.");
    }

}

有人知道如何访问 jdbc 资源/正确注入 EntityManager 实例吗?

非常感谢!

【问题讨论】:

    标签: jakarta-ee glassfish glassfish-3 audit auditing


    【解决方案1】:

    我没有AuditModule 的经验。但是我怀疑你的@Stateless注解没有任何作用,因为EJB应该是通过@EJB注解注入的,我怀疑是这样的。

    我会以 Java SE 的方式使用 creation of EntityManagerFactory

    EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyPersistenceUnit-ejbPU");
    EntityManager em = emf.createEntityManager(); 
    

    请注意,第一行是一项昂贵的操作,因此建议在应用程序启动时仅调用一次。

    【讨论】:

      猜你喜欢
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 2014-02-24
      • 1970-01-01
      相关资源
      最近更新 更多