无法使用 Spring 的 @Value、@ConfigurationProperties 注释从属性文件中检索值

Unable to retrieve value from Properties file using Spring's @Value, @ConfigurationProperties annotations

我是 Spring 引导和使用 Spring 注释的新手。我正在尝试构建一个示例 spring 启动应用程序,在其中我使用属性文件为我的 java 属性 获取一个值。我正在尝试使用 @Component & @ConfigurationProperties 参数。我在网上看了一堆教程,这个 有帮助,但我的 属性 值仍然是 null

这是我的代码。

浏览过:-

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

我的Spring启动应用程序class


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());
  }
}

测试会议Class


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

代码需要做一些小改动:

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

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

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

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

TestConf.Java

你有两个基本问题:

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

  2. Setter(或字段)注入本质上意味着直到构造函数 运行s.

  3. 之后才设置值

如果你想使用某个任务中的 Spring bean,当你启动你的 Boot 应用程序时获取 运行,使用 CommandLineRunner 并注入 bean,最好使用构造函数注入.

you can try with the combination..it will work....

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "pres")
@Data
public class TestConf {

  private String firstName;

.............

}

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

一个控制器class:

@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());
}

阿波乔class

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;
}}

一个配置class

@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

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

感谢您的回答 Whosebug 社区