Допустим, у меня есть этот 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();
// ...
}
}