java - 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 中的价值。
我该如何解决这个问题?
解决方案
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());
}
}
推荐阅读
- flutter - 如何从主隔离和后台隔离刷新和共享访问令牌
- python - Ignore warnings in from Python modules (seaborn, sklearn)
- linux - How to print a number from a specific row and column
- angular - 角材料自动完成不显示列表框的选项
- jsf - p:commandButton doesn't dislpay p:dialog
- python-3.x - 从具有明确前缀但随机后缀的 Cloud Storage 读取文件
- powershell - 尝试使用嵌套引号从 PowerShell 运行 sc create 并且无法使其工作
- python-3.x - 不了解 sklearn 的 HashingVectorizer
- node.js - 使用 nodejs 以编程方式定义表模式
- sql - 如何针对滚动的 1 小时窗口汇总结果