spring-boot - 如何使 ConfigurationProperties bean 和 @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:没有定义负载平衡的假装客户端。您是否忘记包含 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();
// ...
}
}
解决方案
不要忘记@Validated
Java 属性类上的注释:
@Validated
@Configuration
@ConfigurationProperties("app.remote")
public class MyRemoteProperties {
@NotBlank
private String url;
// matching getter/setter...
}
您的应用程序不会因为缺少属性而启动,而不是因为 non-defined-loadbalancing-client-you-don't-need(从而使其错误消息更加尴尬)。
推荐阅读
- java - 如何使用 javax 中另一个 Json(合并 Json)的新内容更新 Json?
- reactjs - Jest 没有覆盖 useEffect 里面的函数
- flutter - 我在颤动时无法捕捉到 Firebase Auth 的异常
- python - 当列表元素可能或可能不作为列存在时,使用给定列表从 Pandas Dataframe 中过滤列
- json - 理想情况下,我应该在前端还是后端将响应(应用程序/XML)转换为 JSON?
- laravel - Laravel eloquent 依赖 belongsTo id
- node.js - 错误:Pm2 管理器节点 js 中的未知选项“--port”
- google-sheets - 使用部分日期/时间戳作为通配符标准的 Google 表格 SUMIF
- asp.net - ASP .Net 文本框中无法识别换行符
- arrays - 在程序开始时不知道大小的情况下声明 char 指针数组