尝试读取@Autowired 配置对象时出现 NullPointerException

Getting NullPointerException when tried to read @Autowired configuration object

我正在尝试从 application.properties 中读取一些属性。我创建了一个带有 @Component@ConfigurationProperties 注释的配置 class。

当我尝试从控制器 class 访问配置时,它工作正常。但是当我试图从一个组件 class 访问配置时,它会抛出一个空指针异常。

以下是 application.properties 和 classes.

application.properties

elasticsearch.ip=localhost

InputManagementController.java

@RestController
public class InputManagementController {


    @Autowired
    private Configuration configuration;

    @GetMapping("/crawler/start")
    public String start(){
        try{

            System.out.println(configuration.getIp()); ----> getting value localhost
            ElasticsearchInterface es=new ElasticsearchInterface();
            es.getInputs();
        }catch (Exception e){
            e.printStackTrace();
        }
        return "started";
    }
}

ElasticsearchInterface.java

@Component
public class ElasticsearchInterface {


    @Autowired
    private Configuration configuration;

    public List<Map<String, Object>> getInputs() {
            System.out.println(configuration.getIp()); ---> getting java.lang.NullPointerException here
        return null;

    }

}

Configuration.java

@Component
@ConfigurationProperties("elasticsearch")
public class Configuration {

    private String ip;
    private int port;
    private String cluster;

    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }

}

A - 如何在 Spring 引导

中从 application.properties 读取自定义 属性

A-1) 应用程序属性文件

application.properties 文件的默认位置之一是 src/main/resources。创建此文件夹以及此文件。假设您的场景,将以下属性放入 application.properties 文件;

myconfig.ip=192.168.166.42
myconfig.port=8090

A-2) 配置Class:AppConfig

为了读取属性文件,您需要一个带有@Configuration 注释的class。对于需要阅读的所有属性,您需要带有 @Value 注释的适当字段。此外,您还需要为这些标有@Value 注释的字段使用getter 方法。请注意,将此 class 命名为 "Configuration" 是一个非常糟糕的选择,因为还有一个同名的注释,因此我将其命名为 "AppConfig"

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Value("${myconfig.ip}")
    private String ip;

    @Value("${myconfig.port}")
    private int port;

    public String getIp() {
        return ip;
    }

    public int getPort() {
        return port;
    }

}

A-3) 演示

然后你创建一个上面写的这个AppConfig class的字段,并用@Autowired注解标记。然后您可以轻松阅读属性文件;

@RestController
@RequestMapping("/")
public class InputManagementController {

    @Autowired
    private AppConfig config;

    @RequestMapping("/test")
    public String test() {
        return String.format(
                "Configuration Parameters: Port: %s, Ip: %s", 
                config.getPort(),
                config.getIp()
        );
    }

}

A-4) 输出

B - 问题的解决方案

B-1) InputManagementController.java

@RestController
public class InputManagementController {

    @Autowired
    private AppConfig configuration;

    @Autowired
    private ElasticSearchInterface elasticSearchInterface;

    @GetMapping("/crawler/start")
    public String start() {
        try {

            System.out.println(configuration.getIp());
            es.getInputs();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "started";
    }
}

B-2) ElasticSearchInterface.java

@Component
public class ElasticSearchInterface {

    @Autowired
    private AppConfig configuration;

    public List<Map<String, Object>> getInputs() {
        System.out.println(configuration.getIp());

        return null;
    }

}

B-3) AppConfig.java

@Configuration
public class AppConfig {

    @Value("${myconfig.ip}")
    private String ip;

    @Value("${myconfig.port}")
    private int port;

    public String getIp() {
        return ip;
    }

    public int getPort() {
        return port;
    }

}