【问题标题】:How to write complex predicate for discovery locator in Spring Cloud Gateway?如何在 Spring Cloud Gateway 中为发现定位器编写复杂的谓词?
【发布时间】:2019-03-16 06:03:39
【问题描述】:

我想自定义发现定位器行为。例如,我的案例是从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)+'/**'

【问题讨论】:

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


    【解决方案1】:

    属性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'))+'/**'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-26
      • 2020-12-15
      • 2020-09-05
      • 2020-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多