4

プロジェクトでユーザーを認証するために 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());
    }
}
4

1 に答える 1

3

同様の問題がありました。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);
}
于 2013-11-01T14:43:35.063 に答える