【问题标题】:Java @Inject null pointer between modules and ServiceLoader模块和 ServiceLoader 之间的 Java @Inject 空指针
【发布时间】:2017-07-06 22:20:39
【问题描述】:

我有三个 maven 模块:

  1. Commons 模块: 常用操作
  2. Provider 模块: 提取数据的具体实现。
  3. 主模块:利用提供者模块。

顺序如下:

  • 主模块接收请求,并有一个接口管理提供程序 (Client) 和使用ServiceLoader.load(Provider.class) 加载提供程序。
  • 我的Client 提取数据 (client.retrieveData(request)) 选择了合适的提供者。
  • 提供者实现方法buildRequest()

这是我的问题:来自 commons 模块的支持类在其他两个模块中使用。我可以使用我在主模块中注入的所有类,但在提供程序模块中注入的类有一个空指针。例如,这是一个提供者类的实现:

public class ScholarProvider extends AbstractProvider {

    @Inject
    private DistanceService distance;
    @Inject
    private final Logger log;
    public static final String URL = "https://scholar.google.com";

    private MapperObjectRDF mapper;

    private String[] domains;
    private Person person;

    public ScholarProvider() {
        person = null;
        mapper = null;
    }
}

ScholarProvider 和任何其他提供程序中,距离和日志为空。我无法理解问题出在哪里。通过ServiceLoader 加载提供程序会不会是问题?有什么建议可能是什么问题?或者有什么可能的解决方案可以让我将DistanceService 与新的实例化一起使用?

【问题讨论】:

  • 您的问题出在这里:ServiceLoader.load(Provider.class) 通过ServiceLoader 加载一个类不会自动将它注册到CDI 容器中。其次,如果您想在部署期间通过选择类的路线,则使用@Alternative 标记您的所有提供程序并启用您希望从beans.xml 中选择的选项,CDI 方式

标签: java dependency-injection cdi


【解决方案1】:

您的 cdi 框架是否知道提供程序是一个可以进行注入的 bean?如果您使用的是 Spring,则需要使用 @Named 或继承自 @Componenent 的任何 Spring 特定注释来注释该类,然后确保扫描该类。如果你的框架不知道你的 bean,它就不会进行任何注入。

【讨论】:

  • 我尝试将@Named注释添加到学者提供者,但它不起作用。我无法修改 AbstractProvider,因为它是来自 maven 依赖项的类。
  • 你的 cdi 框架是否在扫描那个包或者知道那个类是一个 bean?
  • 如何检查我的 cdi 框架是否正在扫描该类?是的,它是一个豆子。
【解决方案2】:

您所描述的不是 CDI 的工作方式。在 CDI 方式中,您将定义每个类并为它们提供限定符。然后你会使用限定符注入它们。

因此,您可以注入引用,而不是使用 ServiceLoader.load(),就像这样

@Inject
@Named("the name")
private Provider provider 

【讨论】:

  • 我无法更改ServiceLoader.load(),因为它是来自另一个库的代码。在我的主模块中,注入工作,我认为作为一种补充解决方案,将注入变量的引用传递给 set 方法中的每个提供程序。
  • 你也可以做 injectFields DeltaSpike 所做的事情 - github.com/apache/deltaspike/blob/master/deltaspike/core/api/…
猜你喜欢
  • 1970-01-01
  • 2016-10-29
  • 2017-08-28
  • 2017-11-04
  • 2018-09-13
  • 2015-06-22
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多