1. 配置类中的字段定义 ```java package com.databstech.doc.gateway.config;

    import lombok.Data;

    /**

    • 每个文档的中文名
      1.  
    • 写-路由里(DocName)
    • spring:
    • cloud:
    • gateway:
    • routes:
      • id: server-user
    • uri: lb://server-user
    • predicates:
      • Path=/api/user/**
      • DocName=用户
      • id: server-basic
    • uri: lb://server-basic
    • predicates:
      • Path=/api/basic/**
      • DocName=基础 *
    • 用在: http://192.168.0.111:200/swagger-resources
    • 接口文档的搜索框中
    • */ @Data public class DocNameConfig { private String name; } ```
    1. 自定义的谓词工厂 - 我是用来健壮 swagger 的,使其业务文档以中文名展示
      1. image.png ```java package com.databstech.doc.gateway.factory;

    import com.databstech.doc.gateway.config.DocNameConfig; import org.apache.commons.lang3.StringUtils; import org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange;

    import java.util.Arrays; import java.util.List; import java.util.function.Predicate;

    /**

    • SwaggerSelectNameRoutePredicateFactory
    • @author tn
    • @version 1
    • @ClassName PredicatesConfig
    • @description 自定义一个谓词工厂类 - 存放swagger 搜索栏 的下拉项目的中文名
    • @date 2020/8/16 1:18 */ @Component public class DocNameRoutePredicateFactory extends AbstractRoutePredicateFactory {
    1. public DocNameRoutePredicateFactory() {
    2. super(DocNameConfig.class);
    3. }
    4. @Override
    5. public Predicate<ServerWebExchange> apply(DocNameConfig config) {
    6. String name = config.getName();
    7. return exchange -> StringUtils.isNotEmpty(name);
    8. }
    9. @Override
    10. public List<String> shortcutFieldOrder() {
    11. return Arrays.asList("name");
    12. }

    }

    1. 3. gateway 配置文件 (spring.cloud.gateway.routes[N].predicates[1].DocName=xxx properties格式应该没写错)
    2. ```yaml
    3. spring:
    4. cloud:
    5. gateway:
    6. routes:
    7. - id: server-user
    8. uri: lb://server-user
    9. predicates:
    10. - Path=/api/user/**
    11. - DocName=用户
    12. - id: server-basic
    13. uri: lb://server-basic
    14. predicates:
    15. - Path=/api/basic/**
    16. - DocName=基础
    17. default-filters:
    18. - StripPrefix=2
    19. # - RewritePath=/api/(?<segment>.*), /$\{segment}
    20. - name: AuthFilter
    21. args:
    22. excludePatterns: #不做权限校验的路径
    23. - /userInfo/login
    24. - /openFeign/test01
    1. 过程中的错误

      1. 工厂类名称必须以自定义谓词开头(这里是TimeBetween),以RoutePredicateFactory结尾,并继承AbstractRoutePredicateFactory抽象类
        1. 我开始没有以 RoutePredicateFactory 结尾出现了错误提示
      2. 最可恶的错误。出现原因大致有三 ```java Configuration property name ‘selectName’ is not valid:

        Invalid characters: ‘N’ Reason: Canonical names should be kebab-case (‘-‘ separated), lowercase alpha-numeric characters and must start with a letter

    Action:

    Modify ‘selectName’ so that it conforms to the canonical names requirements.

    1. i. 类名有除了必须结尾的单词 ,其余单词数量不能超过2个(大写开头为一个) <br />ii. 上面的错还有关联的错误,配置文件中 配置的写法必须为下划线形式
    2. 1. - SwaggerSelect-name=基础 修改后仍然报错,才发现的 第一个 的问题
    3. 2. 错误详情
    4. ```java
    5. reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Unable to find RoutePredicateFactory with name SwaggerSelect-name
    6. Caused by: java.lang.IllegalArgumentException: Unable to find RoutePredicateFactory with name SwaggerSelect-name
    1. iii. 自定义工厂类中的 shortcutFieldOrder() 函数返回值如果出现大小写(必须为下划线格式)<br /> i. 这个方法可以不写,因为我只有一个参数,可以不用排序的w

    c. 构建类的报错

    1. reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under '' to com.tn.gateway.ProjectNameRoutePredicateFactory$projectNameConfig
    2. Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under '' to com.tn.gateway.ProjectNameRoutePredicateFactory$projectNameConfig
    1. 1. 由于我把 配置类中的字段定义 写在了 工厂类中,造成了内部类读取异常
    2. 1. 上面的错误信息 报的是 projectNameConfig ,而上面的配置类为DocNameConfig, 是由于我以为类名是关键字且类名开头没大写而改的

    d. Unable to find specification for group 基础,use default

    1. 1. 是因为子项目没有配置 group 但是不影响,千万记住微服务中不要配置这个,我配置了之后遇到了普通版UI(/v2/api-docs)的请求没有group后缀导致了接口请求404 增强版UI(/v2/api-docs-ext?group=XX)是正常的