Как связать `ConfigurationProperty`s с помощью аннотаций` @ ​​Value` с помощью Spring Binder API? - PullRequest
0 голосов
/ 30 апреля 2020

Как 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.

Поддерживается ли это как-то вообще?

...