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

标签 java spring spring-boot apache-camel

我是 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/

    相关文章:

    java - 不允许使用 Spring Security j_spring_security_check 进行 Spring 启动

    java - 使用 Spring MongoTemplate 自动生成数组中 MongoDB 子文档的 ID

    java - 模拟 Spring Boot

    java - 在 ORMLite 中使用 id 字段作为外部字段

    java - 泽西 Restful 异常(exception) 1

    java - Maven 覆盖层和 jetty 插件

    java - Spring 与 Maven : Maven does not find my resources

    java - 从 Java 对象生成 Spring bean 定义

    java - 无法使用 Java Spring Boot 通过 Rest API 在两个 Docker 容器之间进行通信

    java - 对于 String 类型, getText() 方法未定义。关于从EditText获取内容