现在有这样一个需求,就是在原有的web 接口上面,在加上一个适应app 移动端的接口,路由还是同一个。这里我们就要思考一下了。 相同的路由,也就是requeestHeadlerMapping 要有不同的条件,将其绑定到对应的url .
这里看一下官方文档, 就是继承RequestMappingHandlerMapping,重写getCustomMethodCondition
方法 。
这里我们先新建一个Springboot web 项目, 写一个测试类,
启动看一下控制台
springboot2.1.0 之后是默认是不打印url 的详情的, 这里我们要在 application.properties 里面设置一下
将级别设置为trace .
我们先写一个自定义的注解 @MySystem
在写自己的handlerMapping
在写自己的Condition
public interface RequestCondition<T> {
// 一个http接口上有多个条件规则时,用于合并
T combine(T other);
// 这个是重点,用于判断当前匹配条件和请求是否匹配;如果不匹配返回null
// 如果匹配,生成一个新的请求匹配条件,该新的请求匹配条件是当前请求匹配条件针对指定请求request的剪裁
// 举个例子来讲,如果当前请求匹配条件是一个路径匹配条件,包含多个路径匹配模板,
// 并且其中有些模板和指定请求request匹配,那么返回的新建的请求匹配条件将仅仅
// 包含和指定请求request匹配的那些路径模板。
@Nullable
T getMatchingCondition(HttpServletRequest request);
// 针对指定的请求对象request发现有多个满足条件的,用来排序指定优先级,使用最优的进行响应
int compareTo(T other, HttpServletRequest request);
}
从headler 里面获取参数 , 来区分那个平台,来找到对应平台的url , 执行里面的业务逻辑, 无侵入,不要改之前的业务代码,扩展性也好 。这里还要将其加入springmvc
设置一下优先级,
在写测试类测试一下
启动看一下控制台,
url 信息没有了,别着急,在application.properties 配置里面改一下
改为自己的handlerMapping
哈哈,成功了, 为啥第一个没有condition 呢。 看一下源码
默认就是没有的。
我们来请求测试一下