my annotation@value返回null,即使它被使用并调用到组件注解类中

50few1ms  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(308)

我正在使用spring,需要一些帮助:我想使用application.properties设置一个api键,而不是硬编码它,但它总是返回null。intellij将它正确地计算为我在文件中设置的值。我已经阅读了这里的其他问题,几乎所有的解决方案都说spring只能“注入”托管类中的那些值变量,比如组件、bean等。我就是这么做的,但仍然得到null!其他一切都如我所愿。任何方向都很感激!
我的应用程序.properties

api.someapiservice.key=08e...f

使用属性值的类:

@Component
public class ApiClient implements ApiClientInterface {

@Value("${api.someapiservice.key}")
private String API_KEY;

public ApiClient () {
    System.out.println(API_KEY); //Returns null after spring log info: Initialized JPA EntityManagerFactory for persistence unit 'default'
    ...
}

使用apiclient的类:

@Component
public class SomeService {

private final SomeRepository someRepository;
private final ApiClient apiClient;

public PlaylistService(SomeRepository someRepository , ApiClient apiClient ) {
    this.SomeRepository = SomeRepository;
    this.apiClient = ApiClient;
}
nsc4cvqm

nsc4cvqm1#

在构造示例之前,字段注入不可能发生,因此 @Value (或 @Autowired )构造函数中的字段将始终为空。移动 @Value 改为使用构造函数参数。

7vhp5slm

7vhp5slm2#

如果您想知道启动时@value字段的值是多少。可以使用@postconstruct注解,也可以在类构造函数上移动@value注解。

private String API_KEY;

public ApiClient(@Value("${api.test.value}") String key) {
    this.API_KEY= key;
    System.out.println(this.API_KEY);
}

或者使用@postconstruct注解

@Value("${api.someapiservice.key}")
private String API_KEY;

@PostConstruct
public void init() {
    System.out.println(this.API_KEY);
}

相关问题