尝试从 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"

A​​utowired 仅适用于 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