将EJB和CDI注入Spring处理程序



我目前正在努力将EJB和ManagedBean注入Spring处理程序。我的目标是将这两个bean注入这个AuthenticationSuccessHandler中。

public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
}

这个处理程序是Spring在成功登录时调用的,似乎不处理注入注释。应该注入的两个bean具有以下结构:

@javax.ejb.Stateless
public class EjbService {
}
@javax.enterprise.context.SessionScoped
@javax.inject.Named("cdiBean")
public class CdiBean implements Serializable {
}

到目前为止,我已经尝试了如下各种注释,但变量仍然是null:

public class LoginAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    @EJB
    private UserDatabaseService userDatabaseService;
    @Inject
    private UserManagementBean userManagement;
}

有人能给我指正确的路吗?

通常,您不能将CDI管理的Bean注入Spring管理的Bean中。您将需要使用对Bean Manager的直接访问。例如,使用javax.enterprise.inject.spi.CDI类。

然后你可以做这样的事情:

public static <T> T getInstance(Class<T> type, Annotation... qualifiers) {
    Set<Bean<?>> beans = getBeanManager().getBeans(type, qualifiers);
    Bean<?> bean = getBeanManager().resolve(beans);
    if(bean == null){
        throw new UnsatisfiedResolutionException();
    }
    @SuppressWarnings("unchecked")
    T instance = (T) getBeanManager().getReference(bean, type,
            getBeanManager().createCreationalContext(bean));
    return instance;
}
public static BeanManager getBeanManager() {
    return CDI.current().getBeanManager();
}

最新更新