首页 > 解决方案 > 如何使 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 在连接MyRemotebean 时失败)并且我收到此错误:

原因: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();
        // ...
    }

}

标签: spring-bootspring-cloudbean-validationspring-cloud-feignconfigurationproperties

解决方案


不要忘记@ValidatedJava 属性类上的注释:

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

    @NotBlank
    private String url;

    // matching getter/setter...
}

您的应用程序不会因为缺少属性而启动,而不是因为 non-defined-loadbalancing-client-you-don't-need(从而使其错误消息更加尴尬)。


推荐阅读