有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在外部库中设置CDI

我正在编写自己的小MVC框架,并尝试集成CDI。 这个概念类似于Spring MVC,有ServletDispatcher和@Controller注释

用@Controller映射的类应该是托管bean

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@IndexAnnotated
@RequestScoped
public @interface Controller {
    String value() default "";
}

然后,我想从应用程序上下文中检索库中的控制器类,如下所示

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>

它也出现在我的项目中,使用这个库。已经尝试将范围更改为提供,但没有成功

豆子。xml存在于我的库和main/webapp/WEB-INF/bean上的项目中。xml

我错过了什么?甚至有可能从使用这个库的应用程序的上下文中检索bean吗

我的应用服务器是TomEE


共 (2) 个答案

  1. # 1 楼答案

    感谢TomEE只支持JavaEE6的提示。解决方案

    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;
        }
    }
    
  2. # 2 楼答案

    TomEE支持JavaEE6/CDI1.0

    javax.enterprise.inject.spi.CDI是在JavaEE7/CDI1.1中引入的

    当容器基于旧版本时,不能简单地升级spec api