Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring启动-@值返回null_Java_Spring_Spring Boot - Fatal编程技术网

Java Spring启动-@值返回null

Java 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

我试图使用@Value注释并从属性文件中自动填充变量,但没有成功。未设置值且为空

taskService.java

@服务
公共类任务服务{
@值(“${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();
    }