自动连接我的一个类时,出现空指针异常。
我尝试使用不同的注释,例如@Component
和@ComponentScan
public class ClassA {
public final String str = "String";
public ClassA(){
System.out.println("Class A initiated");
}
}
public class ClassB {
@Autowired
public ClassA classA;
public ClassB(){
System.out.println(classA.str);
}
}
@Configuration
public class Config {
@Bean
public ClassA classA(){
return new ClassA();
}
@Bean
public ClassB classB(){
return new ClassB();
}
}
Stacktrace:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'classB' defined in class path resource [com/test/demo/Config.class]: Bean instantiation via factory method failed;
nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.test.demo.ClassB]: Factory method 'classB' threw exception; nested exception is java.lang.NullPointerException
答案 0 :(得分:2)
构造函数在之前运行。Spring会插入自动连接的字段,因此classA
字段仍为null。
将代码移到构造函数(和字段初始值设定项)之外,您应该看到正确的值。
答案 1 :(得分:2)
而不是使用@Autowired。通过ClassB的构造函数注入ClassA。
public class ClassB {
private final ClassA classA;
public ClassB(ClassA classA){
this.classA = classA;
System.out.println(classA.str);
}
然后将ClassB的Bean配置更改为ClassA。
答案 2 :(得分:1)
如果您希望像这样在构造函数中提取值,则可以使用构造函数注入而不是字段注入:
public class ClassB {
public ClassA classA;
@Autowired
public ClassB(ClassA classA){
this.classA = classA;
System.out.println(classA.str);
}
}
从Spring 4.3开始,具有单个构造函数的类可以省略@Autowired
注释。Spring在进行包扫描时会遇到我们的'ClassB'类,并通过调用带注释的@Autowired
来初始化其实例构造函数。
在代码中,自动装配是在调用no args构造函数之后发生的。因此,当您尝试使用classA对象访问'str'时,由于classA尚未自动装配,因此会导致空指针异常。
答案 3 :(得分:-1)
尝试将@Component
或@Service
放在ClassA
上
@Component
public class ClassA {
public final String str = "String";
public ClassA(){
System.out.println("Class A initiated");
}
}
发生这种情况是因为类ClassA
不是Spring Bean。