【问题标题】:Unable to retrieve value from Properties file using Spring's @Value, @ConfigurationProperties annotations无法使用 Spring 的 @Value、@ConfigurationProperties 注释从属性文件中检索值
【发布时间】:2019-03-27 05:13:40
【问题描述】:

我是 Spring Boot 的新手并使用 Spring Annotations。我正在尝试构建一个示例 Spring Boot 应用程序,在其中我使用属性文件为我的 java 属性获取一个值。我正在尝试使用 @Component@ConfigurationProperties 参数。我在网上看了一堆教程,这StackOverflow article 帮助了,但我的财产价值仍然是null

这是我的代码。

浏览过:-

  1. unable to read properties using configurationproperties annotation

  2. https://www.mkyong.com/spring/spring-propertysources-example/

我的 SpringBoot 应用类


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@EnableAutoConfiguration
@SpringBootApplication
public class Main {


  public static void main(String[] args) {
    ApplicationContext context =   SpringApplication.run(Main.class, args);
    TestConf t = context.getBean(TestConf.class);
    System.out.println(t.toString());
  }
}

TestConf 类


import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties("pres")
public class TestConf {

  private String firstName;

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public TestConf()
  {
    System.out.println("inside constructor");
    System.out.println("first name:" + firstName);
  }


  public static void main(String[] args){
    TestConf t = new TestConf();
  }

  @Override
  public String toString() {
    return "firstName:" + firstName;
  }
}

application.properties

pres.firstName=JACQUELYN

最后是我的 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>phil</groupId>
  <artifactId>springTuit</artifactId>
  <version>1.0-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
  </parent>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- Optional, for bootstrap -->
    <dependency>
      <groupId>org.webjars</groupId>
      <artifactId>bootstrap</artifactId>
      <version>4.3.1</version>
    </dependency>

  </dependencies>
  <build>
    <plugins>
      <!-- Package as an executable jar/war -->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.0</version>
      </plugin>
    </plugins>
  </build>

</project>

application.properties 中的值正确检索到firstName 中缺少什么? 我的application.properties 文件在哪里重要吗?虽然它位于src/main/resources 下的传统位置,而我的java 文件位于src/main/java

【问题讨论】:

  • 您必须指定它的位置,因为您要移动到默认位置。 Spring boot 总是在资源文件夹下寻找属性文件。要更改您可以使用此属性--spring.config.location="file:/path/to/application.properties"
  • 如果你检查,firstNameTestConf 的构造函数上只会是null,并且在main 类中的main 方法上打印正常
  • 另外,为什么TestConf 类中有main 方法?

标签: java spring spring-boot spring-annotations


【解决方案1】:

这似乎是标准的。但是,您可以尝试使用组合

@Component
@PropertySource("classpath:applciation.properties") 
@ConfigurationProperties 

TestConf.Java

【讨论】:

  • 小心,你拼错了“应用程序”。
【解决方案2】:

代码需要几个小改动:

@Component
@ConfigurationProperties("classpath:application.properties")
public class TestConf {

  @Value("pres.firstName")
  private String firstName;

【讨论】:

  • 不会解决不是托管 bean 和使用构造函数中未设置字段的问题。
【解决方案3】:

你有两个基本问题:

  1. 您的 new TestConf() 实例不是 Spring 管理的对象,因此根本不会被注入。

  2. Setter(或字段)注入本质上意味着在构造函数运行之前不会设置值。

如果您想从启动 Boot 应用程序时运行的某个任务中使用 Spring bean,请使用 CommandLineRunner 并注入 bean,最好使用构造函数注入。

【讨论】:

    【解决方案4】:

    你可以试试这个组合..它会工作....

    @Component
    @EnableConfigurationProperties
    @ConfigurationProperties(prefix = "pres")
    @Data
    public class TestConf {
    
      private String firstName;
    
    .............
    
    }
    

    【讨论】:

      【解决方案5】:

      您可以使用@Value 来获取属性的值,或者当您尝试使用 Configuration 类获取配置时,下面的示例可能会有所帮助。

      一个控制器类:

      @RestController
      public class ConfigurationController {
      
      //@Value("${app.name:Movies}") 
      //private String name;
      //Alternative of configuration class
      
      @Autowired
      private Configuration configuration;
      
      @GetMapping("/config")
      public MovieConfiguration retrieveConfiguration() {
      
          return new MovieConfiguration(configuration.getName());
      }
      

      一个 Pojo 类

      public class MovieConfiguration {
      
      private String name;
      
      public MovieConfiguration(String name) {
          this.name=name;
      }
      public String getName() {
          return name;
      }
      public void setName(String name) {
          this.name = name;
      }}
      

      一个配置类

      @Component
      @ConfigurationProperties("app")
      public class Configuration {
      
      private String name;
      
      public String getName() {
          return name;
      }
      
      public void setName(String name) {
          this.name = name;
      }}
      

      属性

      server.port=8091
      app.name=SpaceDrama
      

      【讨论】:

        【解决方案6】:

        所以看起来我没有得到我的价值的原因不是因为代码,而是因为端口正在使用中。我认为应该不是问题,但事实证明,一旦我使用端口终止进程并在那里运行我的应用程序,一切都按预期工作。所以我的代码一开始是正确的..

        感谢您对 stackoverflow 社区的回答

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-09
          • 1970-01-01
          • 1970-01-01
          • 2022-11-03
          • 1970-01-01
          • 2012-08-07
          • 2011-08-01
          • 2019-09-01
          相关资源
          最近更新 更多