在外部库中设置 CDI
Setting CDI in external library
我正在编写自己的小型 MVC 框架,并且正在尝试集成 CDI。
概念类似于Spring MVC,有ServletDispatcher和@Controller注解。
类 映射到 @Controller 应该是托管 bean。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@IndexAnnotated
@RequestScoped
public @interface Controller {
String value() default "";
}
然后,我想像这样从应用程序上下文中检索库中的控制器 class
Object controller = CDI.current().select(controllerClass).get();
但我得到了
java.lang.ClassNotFoundException: javax.enterprise.inject.spi.CDI
我在我的库pom.xml中添加了依赖项
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
</dependency>
它也出现在我使用这个库的项目中。已经尝试将范围更改为提供,但没有成功。
bean.xml 存在于我的库和项目中 main/webapp/WEB-INF/bean。xml
我错过了什么?是否有可能从使用该库的应用程序上下文中检索 bean 的库?
我的应用服务器是TomEE
TomEE 支持 JavaEE 6/CDI 1.0。
javax.enterprise.inject.spi.CDI
是在 Java EE 7/CDI 1.1 中引入的。
当容器基于旧版本时,您不能简单地升级规范 API。
感谢 TomEE 仅支持 Java EE6 的提示。解决方案
public class CdiUtils {
private static BeanManager beanManager;
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> beanClass) throws NamingException {
Bean<T> bean = (Bean<T>) getBeanManager().getBeans(beanClass).iterator().next();
CreationalContext<T> ctx = getBeanManager().createCreationalContext(bean);
return (T) getBeanManager().getReference(bean, beanClass, ctx);
}
private static BeanManager getBeanManager() throws NamingException {
if (beanManager == null) {
InitialContext context = new InitialContext();
beanManager = (BeanManager) context.lookup("java:comp/BeanManager");
}
return beanManager;
}
}
我正在编写自己的小型 MVC 框架,并且正在尝试集成 CDI。 概念类似于Spring MVC,有ServletDispatcher和@Controller注解。
类 映射到 @Controller 应该是托管 bean。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@IndexAnnotated
@RequestScoped
public @interface Controller {
String value() default "";
}
然后,我想像这样从应用程序上下文中检索库中的控制器 class
Object controller = CDI.current().select(controllerClass).get();
但我得到了
java.lang.ClassNotFoundException: javax.enterprise.inject.spi.CDI
我在我的库pom.xml中添加了依赖项
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.2</version>
</dependency>
它也出现在我使用这个库的项目中。已经尝试将范围更改为提供,但没有成功。
bean.xml 存在于我的库和项目中 main/webapp/WEB-INF/bean。xml
我错过了什么?是否有可能从使用该库的应用程序上下文中检索 bean 的库?
我的应用服务器是TomEE
TomEE 支持 JavaEE 6/CDI 1.0。
javax.enterprise.inject.spi.CDI
是在 Java EE 7/CDI 1.1 中引入的。
当容器基于旧版本时,您不能简单地升级规范 API。
感谢 TomEE 仅支持 Java EE6 的提示。解决方案
public class CdiUtils {
private static BeanManager beanManager;
@SuppressWarnings("unchecked")
public static <T> T getBean(Class<T> beanClass) throws NamingException {
Bean<T> bean = (Bean<T>) getBeanManager().getBeans(beanClass).iterator().next();
CreationalContext<T> ctx = getBeanManager().createCreationalContext(bean);
return (T) getBeanManager().getReference(bean, beanClass, ctx);
}
private static BeanManager getBeanManager() throws NamingException {
if (beanManager == null) {
InitialContext context = new InitialContext();
beanManager = (BeanManager) context.lookup("java:comp/BeanManager");
}
return beanManager;
}
}