Java @Inject未使用组件扫描进行注入并导致NullPointerException
我的应用程序上下文XML很简单: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
<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
方法,因此在构建对象之前,我不会使用注入的DAO。这不管用populate
- 将
注入LegacyDAO
并传入。这是有效的,但并不理想,因为我必须把它到处传播(哪种注射应该有助于避免,不是吗?)。它确实证明了ParameterResource
是可注射的。。。只是没有进入LegacyDAO
LegacyParameter
- 在
上添加LegacyParameter
、@服务
或@组件
注释。在我试图引用注入的@命名
的行中,所有这些都以NullPointerException结束legacyDAO
我遗漏了什么?正如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.
}
}