- 配置类中的字段定义 ```java package com.databstech.doc.gateway.config;
 
import lombok.Data;
/**
- 每个文档的中文名
 - 写-路由里(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; } ```
 
- 自定义的谓词工厂 - 我是用来健壮 swagger 的,使其业务文档以中文名展示
```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
{  
public DocNameRoutePredicateFactory() {super(DocNameConfig.class);}@Overridepublic Predicate<ServerWebExchange> apply(DocNameConfig config) {String name = config.getName();return exchange -> StringUtils.isNotEmpty(name);}@Overridepublic List<String> shortcutFieldOrder() {return Arrays.asList("name");}
}
3. gateway 配置文件 (spring.cloud.gateway.routes[N].predicates[1].DocName=xxx properties格式应该没写错)```yamlspring:cloud:gateway:routes:- id: server-useruri: lb://server-userpredicates:- Path=/api/user/**- DocName=用户- id: server-basicuri: lb://server-basicpredicates:- Path=/api/basic/**- DocName=基础default-filters:- StripPrefix=2# - RewritePath=/api/(?<segment>.*), /$\{segment}- name: AuthFilterargs:excludePatterns: #不做权限校验的路径- /userInfo/login- /openFeign/test01
过程中的错误
- 工厂类名称必须以自定义谓词开头(这里是TimeBetween),以RoutePredicateFactory结尾,并继承AbstractRoutePredicateFactory抽象类
- 我开始没有以 RoutePredicateFactory 结尾出现了错误提示
 
 最可恶的错误。出现原因大致有三 ```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
- 工厂类名称必须以自定义谓词开头(这里是TimeBetween),以RoutePredicateFactory结尾,并继承AbstractRoutePredicateFactory抽象类
 
Action:
Modify ‘selectName’ so that it conforms to the canonical names requirements.
i. 类名有除了必须结尾的单词 ,其余单词数量不能超过2个(大写开头为一个) <br />ii. 上面的错还有关联的错误,配置文件中 配置的写法必须为下划线形式1. - SwaggerSelect-name=基础 修改后仍然报错,才发现的 第一个 的问题2. 错误详情```javareactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Unable to find RoutePredicateFactory with name SwaggerSelect-nameCaused by: java.lang.IllegalArgumentException: Unable to find RoutePredicateFactory with name SwaggerSelect-name
iii. 自定义工厂类中的 shortcutFieldOrder() 函数返回值如果出现大小写(必须为下划线格式)<br /> i. 这个方法可以不写,因为我只有一个参数,可以不用排序的w。
c. 构建类的报错
reactor.core.Exceptions$ErrorCallbackNotImplemented: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under '' to com.tn.gateway.ProjectNameRoutePredicateFactory$projectNameConfigCaused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under '' to com.tn.gateway.ProjectNameRoutePredicateFactory$projectNameConfig
1. 由于我把 配置类中的字段定义 写在了 工厂类中,造成了内部类读取异常1. 上面的错误信息 报的是 projectNameConfig ,而上面的配置类为DocNameConfig, 是由于我以为类名是关键字且类名开头没大写而改的
d. Unable to find specification for group 基础,use default
1. 是因为子项目没有配置 group 但是不影响,千万记住微服务中不要配置这个,我配置了之后遇到了普通版UI(/v2/api-docs)的请求没有group后缀导致了接口请求404 增强版UI(/v2/api-docs-ext?group=XX)是正常的
