繁体   English   中英

如何在Spring注入@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM