【问题标题】:Program crashes with NullPointerException when trying to access environment variables from application.properties [duplicate]尝试从 application.properties 访问环境变量时,程序崩溃并出现 NullPointerException [重复]
【发布时间】:2021-12-19 11:30:28
【问题描述】:

这很简单,但我无法弄清楚问题所在。我正在尝试从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"

【问题讨论】:

  • 看起来env 变量为空。哦,这可能是不好的做法,或者甚至没有自动装配静态变量的效果:stackoverflow.com/questions/1018797/…
  • 知道为什么吗?这就是我在网上看到的例子的做法

标签: java spring spring-boot application.properties


【解决方案1】:

你的班级应该有@Service注解或Configuration

@Service
public class MailService {

    @Autowired
    private Environment env;

    ...
}

阅读this,了解更多关于为什么要避免使用static的详细信息。

【讨论】:

    【解决方案2】:

    Autowired 仅适用于 Spring 管理的类实例。该值在构造函数之后注入。您的类不是由 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 管理您的所有类实例并在您需要时注入您的服务。

    @Service
    class AnotherService {
        @Autowired
        private MailService mailSvc;
        ...
        
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-29
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 2020-07-24
      相关资源
      最近更新 更多