首页 > 解决方案 > Spring Boot @Value 注释返回 null

问题描述

我正在尝试将 api 密钥放入 application.properties 并从中获取 api 密钥。

所以我把api key放在application.properties中。

应用程序属性

server.port=8090

#My Key will be placed in here
shortweather.key=myapikey

然后我做了一个类来从 application.properties 获取 api 密钥

ApiKey.java 类

package com.wook.weather;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ApiKey {
    @Value("${shortweather.key}")
    private String apiKey;

    public String getApiKey() {
        return apiKey;
    }

    @Override
    public String toString() {
        return "ApiKey [apiKey=" + apiKey + "]";
    }
    
}

我在 main 方法中创建了一个实例并尝试调用getApiKey()

应用程序.java

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.util.DefaultUriBuilderFactory;

@SpringBootApplication
public class Application {

    private final static String BASE_URL = "http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0";
    
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        
        String serviceKey = "apikey";
        String pageNo = "1";
        String numOfRows = "12";
        String dataType = "JSON";
        String base_date = "20211020";
        String base_time = "2300";
        String nx = "55";
        String ny = "127";

        DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(BASE_URL);
        factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);

        WebClient wc = WebClient.builder().uriBuilderFactory(factory).baseUrl(BASE_URL).build();

        String response = wc.get()
                .uri(uriBuilder -> uriBuilder.path("/getVilageFcst")
                        .queryParam("serviceKey", serviceKey)
                        .queryParam("numOfRows", numOfRows)
                        .queryParam("pageNo", pageNo)
                        .queryParam("dataType", dataType)
                        .queryParam("base_date", base_date)
                        .queryParam("base_time", base_time)
                        .queryParam("nx", nx)
                        .queryParam("ny", ny).build())
                .retrieve().bodyToMono(String.class).block();

        System.out.println(response);
        
        
        //I made ApiKey instance here
        ApiKey apk = new ApiKey();
        //This part return null
        System.out.println(apk.getApiKey());
    }
}

但我得到空值。

我想获得 application.properties 中的价值。

我该如何解决这个问题?

标签: javaspring-boot

解决方案


Spring 仅在 bean 由 spring 管理时注入值。您正在通过调用 new 创建 bean 的实例。这是你控制自己的地方,spring 不再能够注入价值。相反,您应该这样做:

@Autowired
private ApiKey apk;

你还用@Component 标记了 ApiKey 类。因此,spring 将创建一个实例,然后通过自动连接将其注入主调用。当 spring 控制实例化时,您将获得所需的值。

完整代码:


    @SpringBootApplication
    public class Application implements CommandLineRunner {
    
        private final ApiKey apk;
    
        public Application( ApiKey apk ) {
            this.apk = apk;
        }
    
    
        public static void main( String[] args ) {
            SpringApplication.run(Application.class, args);
        }
    
        @Override
        public void run( String... args ) throws Exception {
            
            String serviceKey = "apikey";
            String pageNo = "1";
            String numOfRows = "12";
            String dataType = "JSON";
            String base_date = "20211020";
            String base_time = "2300";
            String nx = "55";
            String ny = "127";
    
            DefaultUriBuilderFactory factory = new DefaultUriBuilderFactory(BASE_URL);
            factory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY);
    
            WebClient wc = WebClient.builder().uriBuilderFactory(factory).baseUrl(BASE_URL).build();
    
            String response = wc.get()
                    .uri(uriBuilder -> uriBuilder.path("/getVilageFcst")
                            .queryParam("serviceKey", serviceKey)
                            .queryParam("numOfRows", numOfRows)
                            .queryParam("pageNo", pageNo)
                            .queryParam("dataType", dataType)
                            .queryParam("base_date", base_date)
                            .queryParam("base_time", base_time)
                            .queryParam("nx", nx)
                            .queryParam("ny", ny).build())
                    .retrieve().bodyToMono(String.class).block();
    
            System.out.println(response);
            System.out.println(apk.getApiKey());
        }
    }


推荐阅读