- 配置类中的字段定义 ```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);
}
@Override
public Predicate<ServerWebExchange> apply(DocNameConfig config) {
String name = config.getName();
return exchange -> StringUtils.isNotEmpty(name);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList("name");
}
}
3. gateway 配置文件 (spring.cloud.gateway.routes[N].predicates[1].DocName=xxx properties格式应该没写错)
```yaml
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=基础
default-filters:
- StripPrefix=2
# - RewritePath=/api/(?<segment>.*), /$\{segment}
- name: AuthFilter
args:
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. 错误详情
```java
reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Unable to find RoutePredicateFactory with name SwaggerSelect-name
Caused 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$projectNameConfig
Caused 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)是正常的