gpt4 book ai didi

java - Autowiring 类方法的空指针异常

转载 作者:行者123 更新时间:2023-12-04 08:00:08 25 4
gpt4 key购买 nike

我是 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) 的实例,其中 configA之前在 Autowiring 过程中创建的实例)
    这将初始化您的 username属性使用 config由构造函数接收。
  • 关于java - Autowiring 类方法的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66513149/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com