[英]How to use configuration maps for custom Quarkus ConfigProperties
[英]How to inject @ConfigProperties in Spring
我有多个 rest 客户端使用通用ClientProperties
class 来将客户端特定属性与实现绑定。
@Data
@Validated
public class ClientProperties {
@NotBlank
private String url;
@NotNull
private LoggingProperties logging;
}
这是application.properties
的示例
# Kasittely service
kasittelyservice.url= ...
kasittelyservice.logging.enabled=true
# Some other service
otherservice.url= ...
otherservice.logging.enabled=false
目前我正在与远程客户端一起做这件事
@Service
public class KasittelyServiceClient {
private final RestTemplate restTemplate;
@SuppressWarnings("unused")
public KasittelyServiceClient(RestTemplateBuilder builder, @Qualifier("kasittelyService") ClientProperties properties) {
builder.rootUri(properties.getUrl());
if (properties.getLogging().isEnabled()) {
// TODO: debug logging interceptor
}
restTemplate = builder.build();
}
public VastausDto kasittelePyynto(PyyntoDto pyyntoDto) {
return restTemplate.postForObject("/kasittelePyynto", pyyntoDto, VastausDto.class);
}
@Configuration
public static class KasittelyServiceClientConfiguration {
@Bean
@Qualifier("kasittelyService")
@ConfigurationProperties(prefix = "kasittelyservice")
public ClientProperties properties() {
return new ClientProperties();
}
}
}
但是,为每个客户端绑定属性的样板很多。
理想情况下,我想做这样的事情,这是不允许的
public KasittelyServiceClient(RestTemplateBuilder builder, @ConfigurationProperties("kasittelyService") ClientProperties properties) {
builder.rootUri(properties.getUrl());
if (properties.getLogging().isEnabled()) {
// TODO: debug logging interceptor
}
restTemplate = builder.build();
}
在这种情况下如何减少样板文件?
您可以创建一个额外的@ConfigurationProperties
class,它将包含所有客户端的属性,这需要定义一个额外的前缀。 例如:
@Data
@Component
@ConfigurationProperties(prefix = "properties")
public class AllClientsProperties {
Map<String, ClientProperties> clients;
public ClientProperties getClientPropertiesByKey(String key) {
return clients.get(key);
}
}
然后,相应地更改您的application.properties
。
# Kasittely service
properties.clients.kasittelyservice.url= ...
properties.clients.kasittelyservice.logging.enabled=true
# Some other service
properties.clients.otherservice.url= ...
properties.clients.otherservice.logging.enabled=false
最后,将AllClientsProperties
bean 作为依赖添加到客户端服务的构造函数中,并通过用于执行初始化逻辑的键获取客户端的属性。
@Service
public class KasittelyServiceClient {
public static final String PROPERTIES_KEY = "kasittelyservice";
private final RestTemplate restTemplate;
@SuppressWarnings("unused")
public KasittelyServiceClient(RestTemplateBuilder builder, AllClientsProperties allClientsProperties) {
ClientProperties properties = allClientsProperties.getClientPropertiesByKey(PROPERTIES_KEY);
builder.rootUri(properties.getUrl());
if (properties.getLogging().isEnabled()) {
// TODO: debug logging interceptor
}
restTemplate = builder.build();
}
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.