语言/框架:Java8 /春季4.3.9 / openjpa 2.4.3
作为Spring的新手,我怀疑我在这里没有应用适当的模式。
这种情况类似于下面所示。但是,我无法使objectB初始化并且抛出 Null Pointer异常。我怀疑问题在于Spring无法初始化类A,但是我无法将“ @Component”注释设置为类A,因为它没有默认的构造函数。有这种情况的解决方法吗?应该遵循的模式?这是Spring改进的遗留代码。
@ContextConfiguration(locations = { "classpath:/context.xml" })
ClassTestA{
@Test
public void TestA(){
:
:
A a = new A ("A", "B", "C", "D");
:
:
// Following line, Throws a null pointer exception in the doSomething() method.
someobject.someMethod(a.doSomething());
}
}
class A {
@Autowired
private B objectB;
public A (string t, string m, string x, string y)
{
// variable inits
}
// C class represents a database table Entity
public C doSomething()
{
C c = new C();
c.someWork(objectB.method()); // throws a null pointer exception because obJectB is null !
}
}
@Component
public class B
{
// No constructor
}
答案 0 :(得分:0)
在测试中,您已经使用new关键字创建了A类对象。一旦完成,spring将不会处理A类中的依赖项,因此不会自动装配B类对象。为了使spring自动装配类的依赖关系,应该通过spring来管理类本身。另一种解决方法是编写一个用@Bean注释的方法,在该方法内,您可以使用您选择的带有默认值的任何构造函数来创建类A的对象,这样您就可以在测试中自动连接类A,而无需使用new关键词。然后,您不必使用@Component注释A类。
@Bean
public A getA() {
return new A(null,null,null,null);
}
您可以在带有@Configuration注释的类中编写以上代码,以便spring读取并创建A对象并将其放入容器中。
您可以同时使用基于XML和注释的配置。只需在sprint.xml中添加标签(请在Google上搜索标签)
在测验中你可以说
@Autowired
private A aObject