【问题标题】:Inject EJB and CDI into Spring-Handler将 EJB 和 CDI 注入 Spring-Handler
【发布时间】:2016-05-03 07:53:29
【问题描述】:

我目前正在努力将 EJB 和 ManagedBean 注入 Spring-Handler。我的目标是将这两个 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;
}

有人能指出正确的方法吗?

【问题讨论】:

  • 你是如何创建LoginAuthenticationSuccessHandler的。
  • 通过 XML:<beans:bean id="authenticationSuccessHandler" class="package.LoginAuthenticationSuccessHandler" />
  • 还有<context:annotation-config /><context:component-scan />。如果没有其中一个,注释几乎毫无用处。

标签: java spring jakarta-ee ejb cdi


【解决方案1】:

通常,您不能将 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();
}

【讨论】:

    猜你喜欢
    • 2015-02-12
    • 2012-03-22
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多