我正在使用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实例吗?
非常感谢提前!
答案 0 :(得分:1)
我没有AuditModule
的经验。但我怀疑你的@Stateless
注释没有任何影响,因为EJB应该通过@EJB
注释注入,我怀疑是这种情况。
我会选择Java SE中的creation of EntityManagerFactory:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MyPersistenceUnit-ejbPU");
EntityManager em = emf.createEntityManager();
请注意,第一行是一项昂贵的操作,因此建议在应用程序启动时仅调用一次。