将 EJB 和 CDI 注入 Spring-Handler
Inject EJB and CDI into Spring-Handler
我目前正在努力将 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;
}
有人能告诉我正确的方法吗?
通常情况下,您无法将 CDI 托管 Bean 注入到 Spring 托管 Bean 中。
您将需要使用对 Bean Manager 的直接访问。
例如,使用 javax.enterprise.inject.spi.CDI class.
那么你可以这样做:
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();
}
我目前正在努力将 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;
}
有人能告诉我正确的方法吗?
通常情况下,您无法将 CDI 托管 Bean 注入到 Spring 托管 Bean 中。 您将需要使用对 Bean Manager 的直接访问。 例如,使用 javax.enterprise.inject.spi.CDI class.
那么你可以这样做:
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();
}