在外部库中设置 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;
    }
}