我有一个Spring Boot应用程序,在其中一个类中,我尝试使用@Value
从application.properties文件中引用属性。但是,该财产没有得到解决。我查看了类似的帖子并尝试遵循这些建议,但这并没有帮助。课程是:
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class PrintProperty {
@Value("${file.directory}")
private String fileDirectory;
public void print() {
System.out.println(fileDirectory);
}
}
我在application.properties
中有属性file.directory。我也有其他领域。
答案 0 :(得分:17)
我遇到了和你一样的问题。这是我的错误代码。
@Component
public class GetExprsAndEnvId {
@Value("hello")
private String Mysecret;
public GetExprsAndEnvId() {
System.out.println("construct");
}
public void print(){
System.out.println(this.Mysecret);
}
public String getMysecret() {
return Mysecret;
}
public void setMysecret(String mysecret) {
Mysecret = mysecret;
}
}
这不是问题,但是 我们需要像这样使用它:
@Autowired
private GetExprsAndEnvId getExprsAndEnvId;
不喜欢这样:
getExprsAndEnvId = new GetExprsAndEnvId();
答案 1 :(得分:12)
确保您的application.properties文件位于src / main / resources / application.properties下。是一种方法。然后按如下方式添加@PostConstruct
示例Application.properties
file.directory = somePlaceOverHere
示例Java类
@ComponentScan
public class PrintProperty {
@Value("${file.directory}")
private String fileDirectory;
@PostConstruct
public void print() {
System.out.println(fileDirectory);
}
}
上面的代码将打印出#34; somePlaceOverhere"
答案 2 :(得分:6)
我想提一下,我使用了春季启动版本1.4.0,因为这个版本你只能写:
@Component
public class MongoConnection {
@Value("${spring.data.mongodb.host}")
private String mongoHost;
@Value("${spring.data.mongodb.port}")
private int mongoPort;
@Value("${spring.data.mongodb.database}")
private String mongoDB;
}
然后随时注入课程。
答案 3 :(得分:2)
要从application.properties中读取值,我们需要使用@SpringBootApplication
注释我们的主类,以及使用@Component或其中各种类型读取的类。下面是我从application.properties
读取值的示例,它在调用Web服务时工作正常。如果您按原样部署相同的代码并尝试从http://localhost:8080/hello进行访问,您将获得存储在application.properties中的关键消息的值。
package com.example;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class DemoApplication {
@Value("${message}")
private String message;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@RequestMapping("/hello")
String home() {
return message;
}
}
试着让我知道
答案 4 :(得分:1)
我遇到了类似的问题,上面的示例对我读取属性没有帮助。我在下面的链接中发布了完整的类,它将帮助您从SpringBoot应用程序中的application.properties文件读取属性值。
Spring Boot - Environment @Autowired throws NullPointerException
答案 5 :(得分:0)
您尚未在OP中包含包声明,但@SpringBootApplication
和@ComponentScan
都无法扫描您的@Component
。
@ComponentScan
Javadoc声明:
ISTR之前浪费了大量时间,发现将应用程序类移动到应用程序包树中的最高包是最简单的。
basePackageClasses
或basePackages
(或其别名value
)可能是 指定用于定义要扫描的特定包。如果具体包装 未定义,扫描将从类的包中发生 声明这个注释。
最近我遇到了一个问题,即在插入值之前正在读取属性。 Jesse的答案很有帮助,因为@PostConstruct
似乎是最早可以阅读插入值的,当然你应该让Spring称之为。
答案 6 :(得分:0)
您的问题是您的配置中需要 static
PropertySourcesPlaceholderConfigurer
Bean定义。我强调静态,因为我有一个非静态的,它没有用。
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
答案 7 :(得分:0)
在服务类中,我有同样的问题要为我的财产获取价值。我通过使用@ConfigurationProperties而不是@Value来解决它。
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties(prefix = "file")
public class FileProperties {
private String directory;
public String getDirectory() {
return directory;
}
public void setDirectory(String dir) {
this.directory = dir;
}
}
@EnableConfigurationProperties({
FileProperties.class
})