Java Spring启动-@值返回null
我试图使用@Value注释并从属性文件中自动填充变量,但没有成功。未设置值且为空 taskService.javaJava Spring启动-@值返回null,java,spring,spring-boot,Java,Spring,Spring Boot,我试图使用@Value注释并从属性文件中自动填充变量,但没有成功。未设置值且为空 taskService.java @服务 公共类任务服务{ @值(“${a}”) 字符串aa; 公共最终RestTemplate RestTemplate; 公共任务服务(RestTemplateBuilder RestTemplateBuilder){ System.out.println(“------------XXXXXXXXXX-----------------------”+aa); this.rest
@服务
公共类任务服务{
@值(“${a}”)
字符串aa;
公共最终RestTemplate RestTemplate;
公共任务服务(RestTemplateBuilder RestTemplateBuilder){
System.out.println(“------------XXXXXXXXXX-----------------------”+aa);
this.restTemplate=restTemplateBuilder.build();
}
公共任务getTask(int taskId)抛出TaskDoesNotExistException{
试一试{
返回这个.restTemplate.getForObject(“/tasks/{taskId}”,Task.class,taskId);
}捕获(HttpClientErrorE异常){
如果(如getRawStatusCode()==404)
抛出新TaskDoesNotExistException(“未找到任务”,e);
}
返回null;
}
}
eventhandler.java
@组件
@RepositoryEventHandler(Application.class)
公共类ApplicationRepositoryEventHandler{
@自动连线
任务服务任务服务;
@车把
public void handleApplicationCreate(应用程序应用程序)抛出TaskDoesNotExistException{
for(整数taskId:application.getTasks()){
taskService.getTask(taskId);
}
}
}
构造对象后发生字段注入。见
只需通过构造函数和testTemplateBuilder一起注入
aa
通常,您应该避免字段注入,或者至少尝试每个类只使用一种注入类型。首先检查是否加载了属性文件,通常在输出日志的开头,您应该看到属性文件的名称 然后在您的一个配置文件中配置以下bean(如果尚未完成)。这个bean解析@Value中的“${}”
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
然后使用您正在执行的方法,它应该解析该属性,并确保TaskServiceBean已实际加载(组件扫描包应包含此类)
虽然我通常使用上述方法,但还有另一种方法,您可能需要检查(仅供参考,上述方法应该有效)
然后在需要的地方使用财产
env.getRequiredProperty(“some.property”)
通常问题是,字段注入是在构造函数完成之后完成的。这意味着您只能在此之后访问注入@value的值。 如果将方法
getAA()
ist添加到TaskService:
public String getAA() {
return aa;
}
调用此方法时,aa的值不为null,因为构造函数是在之前执行的,
@value(${a}”)
的字段注入设置了值。您的代码无法工作,因为Spring需要首先创建类的实例(调用构造函数),然后向字段注入值
public TaskService(@Value("${a}") String aa, RestTemplateBuilder restTemplateBuilder){
System.out.println("----------xxxxxxxxxxx-------------" +aa);
this.restTemplate = restTemplateBuilder.build();
}
public TaskService(RestTemplateBuilder restTemplateBuilder, ){
System.out.println("----------xxxxxxxxxxx-------------" +aa); // 1
this.restTemplate = restTemplateBuilder.build();
}
1) in this moment there is no way Spring can inject value to the fields
像这样修复它:
@Service
public class TaskService {
private final String aa;
private final RestTemplate restTemplate;
public TaskService(RestTemplateBuilder restTemplateBuilder, @Value("${a}" String aa){
this.aa = aa;
System.out.println("----------xxxxxxxxxxx-------------" +this.aa); // 1
this.restTemplate = restTemplateBuilder.build();
}
这是因为您没有将
aa
定义为参数的构造函数,该类也没有setter,因此无法注入它
请阅读。请回答您的问题,以显示您如何获得出现此问题的
TaskService
实例。嗨,ochi,在哪里使用@Configuration annotation。。我在服务类中尝试过,但仍然返回null valueValues,在构造函数完成后注入。只需在构造函数参数中添加@Value(${a}”)字符串aa
。仍然返回空值。我对这个世界不熟悉。。请让我知道,如果这里有任何错误…```@Service@Component@Component扫描公共类TaskService{@Value(${a:'5'})字符串aa;公共RestTemplate RestTemplate;公共TaskService(RestTemplateBuilder RestTemplateBuilder){this.RestTemplate=RestTemplateBuilder.build()在ApplicationRepositoryEventHandler中,您确定taskservice(autowured)attr不为空吗?请确保加载了bean。请至少对您的答案进行简短解释;不要只发布代码。
@Service
public class TaskService {
private final String aa;
private final RestTemplate restTemplate;
public TaskService(RestTemplateBuilder restTemplateBuilder, @Value("${a}" String aa){
this.aa = aa;
System.out.println("----------xxxxxxxxxxx-------------" +this.aa); // 1
this.restTemplate = restTemplateBuilder.build();
}