Как заставить обе аннотации проверки в bean-компоненте ConfigurationProperties и интерфейсе @FeignClient работать вместе?

Скажем, у меня есть этот application.yml (который будет зависеть от среды, например, через профили Spring):

app.remote:
  url: http://whatever.url.it.is:8080/

и соответствующий класс свойств конфигурации в стиле Java:

@Configuration
@ConfigurationProperties("app.remote")
public class MyRemoteProperties {

    @NotBlank
    private String url;

    // matching getter/setter...
}

Мне нужен какой-то клиент для моего удаленного URL:

@Service
@FeignClient(value = "remote", url = "${app.remote.url}")
public interface MyRemote {

    @GetMapping("/what/ever/rest/api")
    String stuff();

}

К сожалению, я не могу выполнить валидацию для MyRemoteProperties например, когда app.remote.url свойство пусто (пусто) приложение не запускается (Spring не удается подключить MyRemote bean), и я получаю эту ошибку:

Вызвано: java.lang.IllegalStateException: не определен клиент Feign для loadBalancing. Вы забыли включить ленту spring-cloud-starter-netflix?

(и мне не нужна балансировка нагрузки; я предполагаю, что это связано с тем, что URL-адрес в какой-то момент пуст, тогда он ожидает некоторую конфигурацию балансировщика нагрузки, следовательно, Ribbon здесь в сообщении об ошибке).

Или, может быть, я не знаю, как подключить его к конфигурации интерфейса MyRemote, например, я также пробовал:

@FeignClient(value = "remote", configuration = MyRemoteProperties.class)

Но результат тот же.

Как мне заставить работать эту проверку?

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.8.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

В какой-то момент вызывается интерфейс:

@Service
public RandomServiceOrController {

    @Autowired
    private MyRemote myRemote;

    public void processMyStuff() {
        // ...
        String myStuff = myRemote.stuff();
        // ...
    }

}

1 ответ

Решение

Не забывайте @Validated аннотация к вашему классу свойств Java:

@Validated
@Configuration
@ConfigurationProperties("app.remote")
public class MyRemoteProperties {

    @NotBlank
    private String url;

    // matching getter/setter...
}

Ваше приложение не запускается из- за отсутствующего свойства, а не из-за необязательного клиента-клиента для балансировки нагрузки (что делает его сообщение об ошибке более неудобным).