【问题标题】:spring @value annotation returns null with non static variablespring @value 注释返回带有非静态变量的 null
【发布时间】:2021-11-20 19:39:34
【问题描述】:

我需要从我的 application.properties 文件中读取值,我已经尝试过:

@ComponentScan(basePackages = "myservice")
public class MailServiceAuthProvider {
    @Value("${my.name}")
    private String name;

    public void myMethod()
    {
      System.out.println(name);
    }
}

我的application.properties在同一个包的资源文件夹中:

my.name=name

但这始终为空

我什至尝试过不从属性文件中读取,而是直接给出值@Value("default-name") 在注解中,但它也是空的。

我在那里阅读了一些教程和一些帖子,它们使用相同的配置。我做错了什么?

UPD 我已将 MailServiceAuthProvider 实例化如下:

@SpringBootApplication
public class App() implements CommandLineRunner {
    @Autowired
    MailServiceAuthProvider a;

    public static void main(String[] args) throws IOException {
        SpringApplication.run(App.class, args);
    }

    @Override
    public void run(String... args) throws Exception {
        a.myMethod();
    }
}

【问题讨论】:

  • MailServiceAuthProvider 是否在 myservice 包中,正如您的组件扫描所暗示的那样?您可以尝试仅使用 Component 注释您的类,然后重试。还要确保你已经为 spring 导入了正确的 Value 注释,即 import org.springframework.beans.factory.annotation.Value;
  • MailServiceAuthProvider是如何实例化的?

标签: java spring properties


【解决方案1】:

使用@Component 而不是@ComponentScan(basePackages = "myservice"),这样您就可以使MailServiceAuthProvider 成为Spring 管理的Bean:

@Component
public class MailServiceAuthProvider {
    @Value("${my.name}")
    private String name;

    public void myMethod()
    {
      System.out.println(name);
    }
}

假设您的应用程序的基础包中有类似以下主类的内容,您甚至不需要@ComponentScan 注释。

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

为什么?因为@SpringBootApplication 封装了@Configuration@EnableAutoConfiguration@ComponentScan 注释及其默认属性。 @ComponentScan 的默认值表示使用@ComponentScan 的包上的所有子包都被扫描。这就是为什么在项目的基础包中包含主类通常是一个好习惯的原因。

【讨论】:

    【解决方案2】:

    好的,我终于解决了这个问题。问题是我用关键字 new 实例化了 MailServiceAuthProvider:

    MailServiceAuthProvider instance = new MailServiceAuthProvider();
    instance.myMethod();
    

    ,但是,我应该像这样使用@Autowired:

    @Autowired
    MailServiceAuthProvider instance;
    
    //...some code
    instance.myMethod();
    

    希望对某人有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多