我是 Apache Camel 的新手,正在尝试构建一个 api。它有三个类(class)。
A 类 - 用于读取 application.properties 文件,如下所示
@Configuration
@ConfigurationProperties(prefix="api")
public class A{
private String username;
public String getUsername(){
return username
}
B 类 - Apache Camel 路线。C 类 - A 类 Autowiring 的 Bean 类。
@Component
public class b extends RouteBuilder{
@Autowired
ClassC customC;
public void configure{
from("direct:start")
.bean(customC)
.to("log:first-timer")
}
}
@Component
class C{
@Autowired
ClassA config;
String username=config.getUsername();
}
每当 IDE 执行 api 时,它都会在 String username=config.getUsername();
行中抛出 Null 指针异常。 .我已经验证spring boot能够加载application.properties。我不确定为什么 Autowiring 类的调用方法会引发空指针异常。
最佳答案
问题出在您的 C
类(class)。
@Component
class C{
@Autowired
A config;
String username = config.gtUsername();
}
Spring初始化时的顺序是这样的:C
的实例(通过调用
new C()
)此构造函数调用
username = config.gtUsername()
并以 NullPointerException
失败因为config
仍然是 null
. @Autowired
(初始化您的 config
属性)但当然它并没有走到这一步,因为异常已经在步骤 1 中发生了。
您可以通过删除
username
的初始化来解决此问题。来自构造函数的属性,而是将其放入单独的方法中
(我们称之为
init()
)并用 @PostConstruct
注释它.另见 Spring PostConstruct and PreDestroy Annotations .
@Component
class C{
@Autowired
A config;
String username;
@PostConstruct
void init() {
username = config.getUsername();
}
}
那么Spring初始化时的顺序是这样的:C
实例(通过调用
new C()
)@Autowired
.(这会初始化您的
config
属性)@PostConstruct
-注释方法。(这将使用已初始化的
username
属性初始化您的 config
属性)解决问题的另一种更简单的方法是使用构造函数
注入(inject)(正如@Ferry 在他的评论中已经建议的那样):
而不是依赖隐式默认构造函数,
您提供
@Autowired
-带注释的构造函数可以带
A config
范围。此外:通过这样做,您将不需要
A config
属性(property)了。@Component
class C{
String username;
@Autowired
C(A config) {
username = config.getUsername();
}
}
那么Spring初始化时的顺序是这样的:@Autowired
(通过调用 C
创建 new C(config)
的实例,其中 config
是 A
之前在 Autowiring 过程中创建的实例)这将初始化您的
username
属性使用 config
由构造函数接收。 关于java - Autowiring 类方法的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66513149/