有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java My annotation@Value返回null,即使它被使用并调用到组件注释类中

我正在使用Spring,需要一些帮助: 我想使用应用程序设置一个API密钥。属性而不是硬编码,但它总是返回null。IntelliJ将其正确计算为我在文件中设置的值。 我已经阅读了这里的其他问题,几乎所有的解决方案都说Spring只能在托管类中“注入”这些值,比如组件、bean等。我就是这么做的,但仍然得到null! 其他一切都按我的计划进行。任何方向都行

我的申请。属性

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'
    ...
}

使用ApicClient的类:

@Component
public class SomeService {

private final SomeRepository someRepository;
private final ApiClient apiClient;

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

共 (2) 个答案

  1. # 1 楼答案

    如果你想知道启动时@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);
    }
    
  2. # 2 楼答案

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