无法使用 Spring 的 @Value、@ConfigurationProperties 注释从属性文件中检索值
Unable to retrieve value from Properties file using Spring's @Value, @ConfigurationProperties annotations
我是 Spring 引导和使用 Spring 注释的新手。我正在尝试构建一个示例 spring 启动应用程序,在其中我使用属性文件为我的 java 属性 获取一个值。我正在尝试使用 @Component
& @ConfigurationProperties
参数。我在网上看了一堆教程,这个 有帮助,但我的 属性 值仍然是 null
这是我的代码。
浏览过:-
我的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
你有两个基本问题:
您的 new TestConf()
实例不是 Spring 托管对象,因此根本不会被注入。
Setter(或字段)注入本质上意味着直到构造函数 运行s.
之后才设置值
如果你想使用某个任务中的 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 社区
我是 Spring 引导和使用 Spring 注释的新手。我正在尝试构建一个示例 spring 启动应用程序,在其中我使用属性文件为我的 java 属性 获取一个值。我正在尝试使用 @Component
& @ConfigurationProperties
参数。我在网上看了一堆教程,这个 null
这是我的代码。
浏览过:-
我的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
你有两个基本问题:
您的
new TestConf()
实例不是 Spring 托管对象,因此根本不会被注入。Setter(或字段)注入本质上意味着直到构造函数 运行s.
之后才设置值
如果你想使用某个任务中的 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 社区