【问题标题】:wildfly - use CDI with POJOwildfly - 将 CDI 与 POJO 结合使用
【发布时间】:2017-02-01 17:38:44
【问题描述】:

我想将 CDI 与 POJO 一起使用。

现在有一个在 Wildfly 10.1.0.Final 中运行的 Jaxrs Resteasy web 应用程序。

有一个返回 ServiceImpl 类的单例:

public class ServiceFactory {

    private static Service service = new ServiceImpl();

    public static Service getEnvsApi()
    {   
       return service;
    }
}

我想在 ServiceImpl 类中使用 CDI

public class ServiceImpl extends Service {

   @Inject
   private MyData    myData;

   @Override
   public MyData getData()
   {
      return myData;
   }
}

myData 始终为空。

我必须手动启动 Weld 吗?

【问题讨论】:

    标签: java cdi weld


    【解决方案1】:

    如果您的 web 应用在 Wildfly 中运行,则无需“启动”Weld。只需在代码中使用 CDI API 并在 webapp/WEB-INF 中添加beans.xml(看看 CDI 的 bean 发现模式),CDI 就会被激活。

    关于您的问题,问题是您通过破坏 CDI 的新运算符实例化服务! ss在其他答案中说,ServiceImpl上必须使用@ApplicationScoped,不需要ServiceFactory

    只需将 ServiceImpl 声明为 @ApplicationScoped

    @ApplicationScoped
    public class ServiceImpl implements Service {
    
       @Inject
       private MyData    myData;
    
       @Override
       public MyData getData()
       {
          return myData;
       }
    
    }
    

    然后你可以@Inject你的Service

    @Inject
    private Service service
    

    【讨论】:

      【解决方案2】:

      您还必须在 ServiceFactory 中注入服务,因为如果您实例化它,它不受 CDI 控制。

      也许您可以完全删除 ServiceFactory 并将 Service 注入您需要的任何地方。

      【讨论】:

        猜你喜欢
        • 2013-10-09
        • 1970-01-01
        • 2016-09-21
        • 2012-07-05
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 2012-03-30
        相关资源
        最近更新 更多