Как ConfigurationProperty
s, которые используют аннотации @Value
, ссылающиеся на vcap.services
среду, могут быть связаны с Spring Binder API?
Используя следующий ConfigurationProperty
класс ...
@Data
@NoArgsConstructor
@Validated
@ConfigurationProperties(prefix = AcmeKafkaConfigurationProperties.PREFIX)
public class AcmeKafkaConfigurationProperties {
public static final String PREFIX = "com.acme.kafka";
@NotBlank(message = "Acme Kafka service instance name must not be blank.")
private String serviceInstanceName;
@NotBlank(message = "Username must not be blank. Make sure it is either specified explicitly or available from VCAP_SERVICES environment.")
@Value("${vcap.services.${com.acme.kafka.service-instance-name}.credentials.username:}")
private String username;
}
... как можно привязать это к среде, используя Spring Binder API?
Этот код не выполняется, поскольку свойство username
не может быть заполнено.
// For Details see this excellent blog post:
// https://spring.io/blog/2018/03/28/property-binding-in-spring-boot-2-0
Iterable<ConfigurationPropertySource> sources = ConfigurationPropertySources.get(environment);
resolver = new PropertySourcesPlaceholdersResolver(environment);
Binder binder = new Binder(sources, resolver);
Bindable<AcmeKafkaConfigurationProperties> bindable = Bindable.of(AcmeKafkaConfigurationProperties.class);
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
SpringValidatorAdapter springValidator = new SpringValidatorAdapter(validator);
BindResult<AcmeKafkaConfigurationProperties> bindResult = binder.bind(AcmeKafkaConfigurationProperties.PREFIX,
bindable,
new ValidationBindHandler(springValidator));
acmeKafkaProps = bindResult.get();
Я проверил, что ${vcap.services.${com.acme.kafka.service-instance-name}.credentials.username:}
может быть правильно решен с помощью PropertyPlaceholderResolver
, и это более глубокая проблема в Binder API.
Поддерживается ли это как-то вообще?