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

时间:2019-03-27 05:13:41

标签: java spring spring-boot spring-annotations

我是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

6 个答案:

答案 0 :(得分:0)

代码需要进行一些小的更改:

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

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

答案 1 :(得分:0)

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

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

TestConf.Java

答案 2 :(得分:0)

您有两个基本问题:

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

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

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

答案 3 :(得分:0)

  

您可以尝试使用该组合。它将起作用。...

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

  private String firstName;

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

}

答案 4 :(得分:0)

您可以使用@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

答案 5 :(得分:0)

所以看来我之所以没有得到我的价值,并不是因为代码,而是因为端口正在使用中。我以为应该不是问题,但是事实证明,一旦我使用端口终止了该进程并在其中运行了我的应用程序,一切就会按预期进行。所以我的代码一开始是正确的。

感谢您的答案stackoverflow社区