【问题标题】:Variable with @Inject is null in OSGi application带有@Inject 的变量在 OSGi 应用程序中为空
【发布时间】:2015-02-23 21:09:51
【问题描述】:

我正在尝试在 OSGi 中运行一个包,而在一个类中我正在使用 @Inject 注释。构建成功,但变量 indexerConfiguration 仍然为空。为什么?

    @Named
    @Singleton
    public class IndexerConfiguration
    {

        private Indexer indexer;    
        private Scanner scanner;    
        private Map<String, IndexCreator> indexers;    

        @Inject
        public IndexerConfiguration( Indexer indexer,
                                     Scanner scanner,
                                     Map<String, IndexCreator> indexers ){
            this.indexer = indexer;
            this.scanner = scanner;
            this.indexers = indexers;
        }
       public Indexer getIndexer(){
          return indexer;
       }

第二个类在同一个包中:

public class MyFactory implements ManagedServiceFactory {
    public static final String PID = "myPid";

    private volatile DependencyManager m_dependencyManager;
    private final Map<String, Component> m_components = new HashMap<String, Component>();

    @Inject
    private IndexerConfiguration indexerConfiguration;


    @Override
    public String getName() {
        return "myBundle";
    }

    @Override
    public void updated(String pid,
            @SuppressWarnings("rawtypes") Dictionary properties)
            throws ConfigurationException {

        if (m_components.containsKey(pid)) {
            return;
        }

        Component component = m_dependencyManager
                .createComponent()
                .setImplementation(myOwnClass.class)
                .add(m_dependencyManager.createConfigurationDependency()
                        .setPid(pid));

        indexerConfiguration.getIndexer(); //this is still null :( why?
        m_components.put(pid, component);
        m_dependencyManager.add(component);

    }

所有导入都正常,构建成功,但是为什么注入不起作用?谢谢

【问题讨论】:

  • OSGi 本身不支持@Inject。您是否正在使用任何应该支持它的框架?
  • ......嗯,我虽然......不,不。没有框架:(谢谢

标签: osgi inject


【解决方案1】:

有一些方法可以在 OSGi 中使用 @Inject。

一种是使用pax-cdi,它为 OSGi 适配了 CDI 框架 OpenWebBeans 或 Weld。这里的好处是它旨在完全支持 CDI 标准。目前的缺点是在jpa支持等一些角落还是有点实验性的。

另一种方法是使用来自 aries 的 blueprint-maven-plugin。它支持一小部分 CDI 并在编译时将其映射到蓝图上下文。这里的优点是它已经支持 jpa,并且您可以将它与手写蓝图结合以实现更复杂的案例并利用蓝图扩展,如用于 web 服务的 apache cxf 和用于集成的 apache camel。缺点是它只支持 CDI 的一小部分,还没有很好的文档记录。它仍然工作得很好,我已经在一个大型客户项目中使用它从 spring/tomcat 迁移到 blueprint/OSGi。 我有一个小示例项目tasklist-blueprint-cdi at github。我也打算很快做一个关于它的教程。

如果这一切对您来说过于实验性,那么 OSGi 中经过验证的 DI 和服务解决方案是蓝图和声明式服务。但它们也有自己的局限性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-23
    • 2017-01-12
    • 2015-04-27
    • 1970-01-01
    相关资源
    最近更新 更多