尝试读取@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;
}
}
我正在尝试从 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;
}
}