首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java-EE-6 / Glassfish:如何从自定义审计模块访问实体管理器?

Java-EE-6 / Glassfish:如何从自定义审计模块访问实体管理器?
EN

Stack Overflow用户
提问于 2013-03-06 01:49:56
回答 1查看 403关注 0票数 0

我使用的是Glassfish 3.1.2.2,我希望收集身份验证信息并将其存储到附加到Glassfish应用服务器的MySQL数据库中。到目前为止,我成功地实现了一个自定义审计模块,并将其放入了我的ejb项目中。到目前为止,这是没有问题的。

现在我想在登录尝试失败时设置一些标志和计数器。为此,我尝试向AuditModule类/对象注入一个EntityManager实例,但由于注入失败,因此总是抛出空指针异常。

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

以下是我的自定义审计模块:

代码语言:javascript
复制
@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实例吗?

首先要感谢大家!

EN

回答 1

Stack Overflow用户

发布于 2013-03-06 02:12:18

我没有使用AuditModule的经验。但我怀疑您的@Stateless注释没有任何效果,因为应该通过@EJB注释注入EJB,我对此表示怀疑。

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

代码语言:javascript
复制
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyPersistenceUnit-ejbPU");
EntityManager em = emf.createEntityManager(); 

请注意,第一行是一个开销很大的操作,因此建议仅在应用程序启动时调用它一次。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15230670

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档