使用@Value会带来UnsatisfiedDependencyException

时间:2019-02-15 05:43:08

标签: java spring

我有一个ApiRest类,该类具有一个名为myKey的成员,该成员试图根据从abc.properties文件中获取的值进行设置。当我使用@Value设置变量时,出现以下错误:

  

原因:   org.springframework.beans.factory.UnsatisfiedDependencyException:   创建名称为bean的错误...   'org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration':   通过构造函数参数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无法将值插入变量,以及如何解决此问题?

1 个答案:

答案 0 :(得分:1)

在实际注入字段之前,您无法读取由spring bean后处理器注入其值的字段的值。

请参阅@Value的Java文档

  

请注意,@ Value批注的实际处理是由   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