我是Spring Boot的新用户,正在使用Spring Annotations。我正在尝试构建一个示例spring boot应用程序,在该应用程序中我使用属性文件获取java属性的值。我正在尝试使用@Component
和@ConfigurationProperties
参数。我在线上关注了很多教程,这StackOverflow article有所帮助,但我的财产价值仍然是null
这是我的代码。
浏览:-
unable to read properties using configurationproperties annotation
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
答案 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)
您有两个基本问题:
您的new TestConf()
实例不是Spring管理的对象,因此根本不会被注入。
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社区