Как заставить аннотации проверки в bean-компоненте ConfigurationProperties и интерфейсе @FeignClient работать вместе? - PullRequest
0 голосов
/ 23 сентября 2019

Допустим, у меня есть этот 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 пустое (пустое), приложение не 't start (Spring не запускается при подключении компонента MyRemote), и я получаю эту ошибку:

Причина: java.lang.IllegalStateException: Не определен клиент Feign для loadBalancing.Вы забыли включить Spring-Cloud-Starter-Netflix-Ribbon?

(и я не хочу балансировки нагрузки; я предполагаю, что это потому, что 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();
        // ...
    }

}
...