java - 使用 @Value 会产生 UnsatisfiedDependencyException

标签 java spring

我有一个 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/

相关文章:

java - 无法从 netty 服务器接收客户端响应

java - 如何在Java中反序列化xml文件中的电子邮件列表?

java - Spring Security 获取后访问被拒绝 403

Spring MVC 使用表单 :checkbox to bind data

java - Android以编程方式切换AP

java - 有序二叉树,使用树排序按升序打印字符串

java - 在spring中获取工厂类的servletcontext

支持事务关联的 Java 或 Spring async TaskExeuctor?

java - Jlink Spring Boot

java - 从 1.5 上的客户端调用 1.6 上的 EJB