我正在使用picketlink对项目中的用户进行身份验证。我还创建了一个带@produces注释的方法,这样我就可以在其他地方注入经过身份验证的用户。现在,我正在使用envers,除了默认信息之外,我还想存储执行该操作的用户,但我无法将其注入到envers侦听器中。它始终为空。如何进行此注入,或检索此信息?
生产者类:
@SessionScoped
public class Resources implements Serializable {
private static final long serialVersionUID = 1L;
@EJB
private AuthenticationManagerBean authenticator;
@Inject
private Identity credentials;
@CurrentUser
private AuthenticatedUser currentUser;
@Produces
@CurrentUser
@SessionScoped
private AuthenticatedUser createAuthenticatedUser() {
AuthenticatedUser user = new AuthenticatedUser();
org.picketlink.idm.model.basic.User loggedInUser = (org.picketlink.idm.model.basic.User) credentials.getAccount();
User pu = authenticator.getUserRoles(loggedInUser.getLoginName());
if (pu != null) {
user.setUser(pu.getName());
for (Role role : pu.getRoles()) {
user.getRoles().add(role.getName());
}
}
return user;
}
@Produces
public Logger produceLog(InjectionPoint injectionPoint) {
return LoggerFactory.getLogger(injectionPoint.getMember().getDeclaringClass().getName());
}和envers监听器:
public class AuditListener implements RevisionListener, Serializable {
private static final long serialVersionUID = 1L;
@Inject
@CurrentUser
private AuthenticatedUser identity; //this is always null
public void newRevision(Object revisionEntity) {
System.out.println(identity.getUser());
}
}发布于 2013-11-01 22:43:35
我也有类似的问题。注入无法工作,因为RevisionListener不是由CDI管理的。这样,您就必须自己查找bean。你可以这样做:
public AuthenticatedUser getAuthenticatedUser() {
BeanManager beanManager = (BeanManager) new InitialContext().lookup("java:comp/BeanManager");
Bean<AuthenticatedUser> bean = (Bean<AuthenticatedUser>) beanManager.getBeans(AuthenticatedUser.class, new AnnotationLiteral<CurrentUser>() {
}).iterator().next();
CreationalContext<AuthenticatedUser> ctx = beanManager.createCreationalContext(bean);
return (AuthenticatedUser) beanManager.getReference(bean, AuthenticatedUser.class, ctx);
}https://stackoverflow.com/questions/18870423
复制相似问题