我有一个 ApiRest 类,它有一个名为 myKey
的成员,我试图根据从 abc.properties
文件获取的值来设置该成员。当我使用 @Value
设置变量时,出现以下错误:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ... 'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 1;
但是如果我直接使用 private String myKey = "my-Key";
设置该值,它就可以正常工作。我的代码如下所示:
@Path("api/data")
@Controller
@Produces(MediaType.APPLICATION_JSON)
public class ApiRest{
@Value("${my-service.key}")
private String myKey;
private final MyClient myClient = MyClient.builder().key(myKey).build();
//Remaining Code
//I use myClient Object to use one of its method
}
为什么@Value
无法将值注入(inject)变量以及如何解决此问题?
最佳答案
在实际注入(inject)之前,您无法读取由 spring bean 后处理器注入(inject)的值的字段值。
查看@Value
的java文档
Note that actual processing of the @Value annotation is performed by a BeanPostProcessor
这意味着您试图过早读取字段 myKey
的值:
private final MyClient myClient = MyClient.builder().key(myKey).build();
您应该将字段 myClient
的初始化移动到另一个方法本身,例如用 @PostConstruct
@PostConstruct
public void init() {
this.myClient = MyClient.builder().key(myKey).build();
}
可以进一步阅读here
关于java - 使用 @Value 会产生 UnsatisfiedDependencyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54703284/