Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Inject未使用组件扫描进行注入并导致NullPointerException_Java_Spring_Dependency Injection - Fatal编程技术网

Java @Inject未使用组件扫描进行注入并导致NullPointerException

Java @Inject未使用组件扫描进行注入并导致NullPointerException,java,spring,dependency-injection,Java,Spring,Dependency Injection,我的应用程序上下文XML很简单: <context:component-scan base-package="com.depressio.spring" /> 在com.depressio中,有一个存储库(DAO): 。。。以及注入工作正常的服务(使用参数DAO时无NPE): 但是,那里的legacyFormat()方法调用构造了另一个对象。在这个对象中,我必须注入一个不同的DAO(不过也用@Repository注释)。注射无效 因此,我们有原始的参数对象: package com

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

<context:component-scan base-package="com.depressio.spring" />
com.depressio
中,有一个存储库(DAO):

。。。以及注入工作正常的服务(使用参数DAO时无NPE):

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

因此,我们有原始的
参数
对象:

package com.depressio.domain;

public class Parameter
{
    ...
    public LegacyParameter legacyFormat()
    {
        return new LegacyParameter(this);
    }
}
。。。以及注射不起作用的
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
    方法,因此在构建对象之前,我不会使用注入的DAO。这不管用

  • LegacyDAO
    注入
    ParameterResource
    并传入。这是有效的,但并不理想,因为我必须把它到处传播(哪种注射应该有助于避免,不是吗?)。它确实证明了
    LegacyDAO
    是可注射的。。。只是没有进入
    LegacyParameter

  • LegacyParameter
    上添加
    @服务
    @组件
    @命名
    注释。在我试图引用注入的
    legacyDAO
    的行中,所有这些都以NullPointerException结束


我遗漏了什么?

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

也就是说,在某些特殊情况下,您仍然希望自己“动态”创建对象,但依赖Spring向这些对象注入依赖项。在这种情况下,您应该显式调用Spring: LegacyParameter p=新的LegacyParameter(…); applicationContext.getAutowireCapableBeanFactory().autowireBean(p); 我不认为你真的需要它。 (如果确实需要,请参阅此链接以获取示例)

此外,我建议您简化配置。
为什么您同时使用基于xml和基于java的配置,而这两种配置实际上是相同的?在您的示例中,您只能保留其中一个,并且具有相同的效果。

新的LegacyParameter(This)
不是Spring管理的bean。如何使用注释来实现这一点?我每次都需要构造一个新的对象,我很想让spring来做,但我不清楚如何使用注释来做。。。特别是考虑到构造函数参数。我假设我必须在配置中定义
@Bean
,但不确定它应该是什么样子,也不确定如何在
legacyFormat()
中调用它。如果您坚持希望将Spring依赖项注入功能应用于您自己创建的域对象,请将Spring与AspectJ一起使用,请参阅
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();
    }
}
package com.depressio.domain;

public class Parameter
{
    ...
    public LegacyParameter legacyFormat()
    {
        return new LegacyParameter(this);
    }
}
package com.depressio.domain.legacy;

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