如何在Spring Cloud Gateway中为发现定位器编写复杂的谓词?

时间:2018-10-11 08:11:04

标签: spring spring-cloud spring-cloud-gateway

我想自定义发现定位器行为。例如,在我的案例中,有一个是从gateway_host/prohibitions路由到名为prohibitions-ui的服务的。为此,我使用以下配置:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
          filters: PreserveHostHeader
          include-expression: serviceId.endsWith('-UI')
          predicates: Path='/'+serviceId.substring(0,serviceId.indexOf('-UI'))+'/**'

然后出现错误:

Failed to bind properties under 'spring.cloud.gateway.discovery.locator.predicates' to java.util.List<org.springframework.cloud.gateway.handler.predicate.PredicateDefinition>:

Reason: failed to convert java.lang.String to org.springframework.cloud.gateway.handler.predicate.PredicateDefinition

我认为此错误上升是因为有两个参数传递给substring方法。如果我将方法调用更改为substring(0),则应用程序成功启动,但是对我来说这样的配置没有意义: predicates: Path='/'+serviceId.substring(0)+'/**'

1 个答案:

答案 0 :(得分:0)

属性spring.cloud.gateway.discovery.locator.predicates引用谓词定义的列表,请参见org.springframework.cloud.gateway.discovery.DiscoveryLocatorProperties。您指定的内容将转换为String,因此无法转换为所需的类型。

您可以尝试如下指定谓词:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          predicates: 
          - name: Path
            args:
              pattern: '/'+serviceId.substring(0,serviceId.indexOf('-UI'))+'/**'