尝试从 application.properties 访问环境变量时程序崩溃并出现 NullPointerException
Program crashes with NullPointerException when trying to access environment variables from application.properties
这很简单,但我不知道问题出在哪里。我正在尝试从 application.properties
访问环境变量,但是当我这样做时:
import org.springframework.core.env.Environment;
public class MailService {
@Autowired
private static Environment env;
...
...
...
public static void send(){
System.out.println("env {}" + env.getProperty("AWS_ACCESS_KEY_ID"));
}
然后我得到一个 NullPointerException。
那么发生了什么?为什么我会收到错误。这是我的 application.properties
文件,其中包含假值:
AWS_ACCESS_KEY_ID="Asdsds"
AWS_SECRET_KEY="sdsdsdsdsdsd"
Autowired 仅适用于 class 个由 Spring 管理的实例。该值在构造函数之后注入。您的 class 不受 Spring 管理,您的环境 属性 是静态的。
像这样的东西会起作用:
@Service // Will be instantiated by spring
public class MailService {
private static Environment env;
@Autowired // This will be called after instantiation
public void initEnvironment(Environment env){
MailService.env = env;
}
public static void send(){
// NullPointerException will be thrown if this method is called
// before Spring created the MailService instance
System.out.println("env {}" + env.getProperty("AWS_ACCESS_KEY_ID"));
}
}
如果您想访问由 Spring 管理的对象,您应该避免使用静态方法。
而是让 Spring 管理您所有的 class 实例并在您需要时注入您的服务。
@Service
class AnotherService {
@Autowired
private MailService mailSvc;
...
您的 class 应该有 @Service
注释或 Configuration
:
@Service
public class MailService {
@Autowired
private Environment env;
...
}
阅读 this 详细了解为什么要避免 static
。
这很简单,但我不知道问题出在哪里。我正在尝试从 application.properties
访问环境变量,但是当我这样做时:
import org.springframework.core.env.Environment;
public class MailService {
@Autowired
private static Environment env;
...
...
...
public static void send(){
System.out.println("env {}" + env.getProperty("AWS_ACCESS_KEY_ID"));
}
然后我得到一个 NullPointerException。
那么发生了什么?为什么我会收到错误。这是我的 application.properties
文件,其中包含假值:
AWS_ACCESS_KEY_ID="Asdsds"
AWS_SECRET_KEY="sdsdsdsdsdsd"
Autowired 仅适用于 class 个由 Spring 管理的实例。该值在构造函数之后注入。您的 class 不受 Spring 管理,您的环境 属性 是静态的。
像这样的东西会起作用:
@Service // Will be instantiated by spring
public class MailService {
private static Environment env;
@Autowired // This will be called after instantiation
public void initEnvironment(Environment env){
MailService.env = env;
}
public static void send(){
// NullPointerException will be thrown if this method is called
// before Spring created the MailService instance
System.out.println("env {}" + env.getProperty("AWS_ACCESS_KEY_ID"));
}
}
如果您想访问由 Spring 管理的对象,您应该避免使用静态方法。
而是让 Spring 管理您所有的 class 实例并在您需要时注入您的服务。
@Service
class AnotherService {
@Autowired
private MailService mailSvc;
...
您的 class 应该有 @Service
注释或 Configuration
:
@Service
public class MailService {
@Autowired
private Environment env;
...
}
阅读 this 详细了解为什么要避免 static
。