Как заставить обе аннотации проверки в 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...
}
Ваше приложение не запускается из- за отсутствующего свойства, а не из-за необязательного клиента-клиента для балансировки нагрузки (что делает его сообщение об ошибке более неудобным).