gpt4 book ai didi

java - @Inject 使用组件扫描不注入(inject)并导致 NullPointerException

转载 作者:太空宇宙 更新时间:2023-11-04 14:54:52 38 4
gpt4 key购买 nike

我的应用程序上下文 XML 很简单:

<context:component-scan base-package="com.depressio.spring" />

在该包中,我有我的配置:

package com.depressio.spring

@Configuration
@ComponentScan(basePackages = "com.depressio")
public class DepressioConfiguration
{
@Inject private ApplicationContext context;
}

com.depressio 中,有一个存储库 (DAO):

package com.depressio.dao;

@Repository
public class ParameterDAO
{
public Parameter getParameter(long ID) { ... }
}

...以及注入(inject)工作正常的服务(使用parameterDAO时没有NPE):

package com.depressio.resource;

@Service
@Path("/depressio/parameters")
public class ParameterResource
{
@Inject private ParameterDAO parameterDAO;

@Path("{id}")
public Response getParameter(long parameterID)
{
return Response.ok(parameterDAO.getParameter(parameterID).legacyFormat()).build();
}
}

但是,那里的 legacyFormat() 方法调用构造了另一个对象。在该对象中,我必须注入(inject)一个不同的 DAO(不过也用 @Repository 注释)。该注入(inject)不起作用。

因此,我们有了原始的 Parameter 对象:

package com.depressio.domain;

public class Parameter
{
...
public LegacyParameter legacyFormat()
{
return new LegacyParameter(this);
}
}

...以及注入(inject)不起作用的 LegacyParameter:

package com.depressio.domain.legacy;

public class LegacyParameter
{
@Inject private LegacyDAO legacyDAO;
....
public LegacyParameter(Parameter newParameter)
{
// NullPointerException when using the injected legacyDAO.
}
}

我尝试了一些方法,包括:

  • LegacyParameter 使用无参数构造函数,然后调用 populate 方法,这样在构造对象之前我不会使用注入(inject)的 DAO。这不起作用。

  • LegacyDAO 注入(inject) ParameterResource 并将其传入。这可行,但并不理想,因为我必须多次传递它(哪种注入(inject)应该有助于避免,不是吗?)。它确实证明了 LegacyDAO 是可注入(inject)的......只是显然不能注入(inject) LegacyParameter 中。

  • LegacyParameter 上添加 @Service@Component@Named 注释。所有最终都以 NullPointerException 出现在我尝试引用注入(inject)的 legacyDAO 的行上。

我错过了什么?

最佳答案

正如 Sotirios 所指出的,它无法工作,因为您创建了一个常规 Java 对象并且没有给 Spring 增强它的机会。要么让 Spring 创建您想要享受 Spring“魔力”的对象(例如设置 @Inject 依赖项等)。或者创建您自己的对象并自行设置依赖项 (yourObject.setDao(dao))。

也就是说,在某些特殊情况下,您仍然希望自己“即时”创建对象,但依赖 Spring 向这些对象注入(inject)依赖项。在这种情况下,您应该显式调用 Spring:LegacyParameter p = new LegacyParameter(...);applicationContext.getAutowireCapableBeanFactory().autowireBean(p);我认为你的情况并不真正需要它。(当确实需要时,请参阅此链接 inject bean reference into a Quartz job in Spring? 的示例)。

此外,我建议简化您的配置。为什么同时使用基于 xml 和基于 java 的配置,而它们的作用实际上是相同的?在您的示例中,您可以只保留其中之一并具有相同的效果。

关于java - @Inject 使用组件扫描不注入(inject)并导致 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23326278/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com