[英]Spring boot native configuration
我正在嘗試將現有的 Spring Boot 應用程序遷移到 Spring Native。 在這種情況下,我有application.properties
和application-dev.properties
。
package com.test;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.util.CollectionUtils;
import org.springframework.web.client.RestTemplate;
import com.test.RestTemplateHeaderModifierInterceptor;
@SpringBootApplication(proxyBeanMethods = false)
public class TestApplication {
@Value("${rest.template.connect.timeout}")
private Integer CONNECT_TIMEOUT;
@Value("${rest.template.connect.request.timeout}")
private Integer CONNECT_REQUEST_TIMEOUT;
@Value("${rest.template.read.timeout}")
private Integer READ_TIMEOUT;
@Value("${rest.template.max.conn.per.route}")
private Integer MAX_CONN_PER_ROUTE;
@Value("${rest.template.max.conn}")
private Integer MAX_CONN;
@Value("${slow.rest.template.read.timeout}")
private Integer SLOW_READ_TIMEOUT;
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@Bean
@Primary
public RestTemplate restTemplate(RestTemplateBuilder builder) {
return getRestTemplateWithTimeout(READ_TIMEOUT);
}
@Bean("slowRestTemplate")
public RestTemplate slowRestTemplate(RestTemplateBuilder builder) {
return getRestTemplateWithTimeout(SLOW_READ_TIMEOUT);
}
private RestTemplate restTemplate(HttpComponentsClientHttpRequestFactory requestFactory) {
RestTemplate restTemplate = new RestTemplate(requestFactory);
List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
if (CollectionUtils.isEmpty(interceptors)) {
interceptors = new ArrayList<>();
}
interceptors.add(new RestTemplateHeaderModifierInterceptor());
restTemplate.setInterceptors(interceptors);
return restTemplate;
}
private RestTemplate getRestTemplateWithTimeout(Integer readTimeout) {
HttpComponentsClientHttpRequestFactory requestFactory = getRequestFactory(readTimeout);
return this.restTemplate(requestFactory);
}
private HttpComponentsClientHttpRequestFactory getRequestFactory(Integer readTimeout) {
HttpComponentsClientHttpRequestFactory requestFactory = getConnectionSettings();
requestFactory.setReadTimeout(readTimeout);
return requestFactory;
}
private HttpComponentsClientHttpRequestFactory getConnectionSettings() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(MAX_CONN_PER_ROUTE);
connectionManager.setMaxTotal(MAX_CONN);
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactory(
HttpClientBuilder.create().setConnectionManager(connectionManager).build());
requestFactory.setConnectionRequestTimeout(CONNECT_REQUEST_TIMEOUT);
requestFactory.setConnectTimeout(CONNECT_TIMEOUT);
return requestFactory;
}
}
AppConfig.java
@Configuration(proxyBeanMethods = false)
@Component
@EnableAspectJAutoProxy
@EnableAutoConfiguration
@EnableRetry
public class AppConfig {
}
配置文件
@Configuration(proxyBeanMethods = false)
@PropertySource("classpath:application-${environment_region}.properties")
public class Config {
private Map<String, String> map = new HashMap<String, String>();
public String get(String key) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(Config.class);
ConfigurableEnvironment env = context.getEnvironment();
if (!map.containsKey(key) || map.get(key) == null) {
map.put(key, env.getProperty(key));
}
String propertyValue = map.get(key);
context.close();
return propertyValue;
}
}
使用構建圖像后
./mvnw package -Pnative -DskipTests
當我運行應用程序時,我收到以下錯誤:
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'rest.template.connect.timeout' in value "${rest.template.connect.timeout}"
at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) ~[na:na]
at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[na:na]
at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[na:na]
at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[na:na]
at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:191) ~[na:na]
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:936) ~[na:na]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1330) ~[na:na]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309) ~[na:na]
at org.springframework.aot.beans.factory.InjectedFieldResolver.resolve(InjectedFieldResolver.java:43) ~[na:na]
at org.springframework.aot.beans.factory.InjectedElementResolver.resolve(InjectedElementResolver.java:35) ~[na:na]
at org.springframework.aot.beans.factory.InjectedElementResolver.invoke(InjectedElementResolver.java:53) ~[na:na]
at com.oyo.boltkeeper.ContextBootstrapInitializer.lambda$registerBoltKeeperApplication$6(ContextBootstrapInitializer.java:15) ~[na:na]
at org.springframework.aot.beans.factory.BeanDefinitionRegistrar$ThrowableFunction.apply(BeanDefinitionRegistrar.java:294) ~[na:na]
at org.springframework.aot.beans.factory.BeanDefinitionRegistrar.lambda$instanceSupplier$0(BeanDefinitionRegistrar.java:115) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.obtainFromSupplier(AbstractAutowireCapableBeanFactory.java:1249) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1191) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[na:na]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[na:na]
... 13 common frames omitted
spring boot 原生應用程序中傳遞配置的方式是什么? 還是有不同的方式? 這里做錯了什么嗎?
我沒有足夠的聲譽發表簡單的評論:我的答案不完整......
首先,我認為您應該放棄配置文件的概念, 官方文檔中建議您這樣做。 此外,配置文件的概念與 Ahead Of Time 編譯相反。 如果您仍然想要,文檔建議在配置文件中明確指定您的活動配置文件。 我猜想以spring.profiles.active=default,dev
為例。
另一方面,我認為您應該在命令行上使用此選項指定配置文件的路徑: --spring.config.location=classpath:/default.properties,classpath:/override.properties
。 請參閱此其他文檔。
在“企業”上下文中,我們不將配置文件包含在 .jar 可執行文件中:配置是外部化的。 所以我認為對於原生圖像,情況總是如此。
如果您找到解決方案,請隨時分享您的解決方案
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.