修改背景
项目在执行一半的时候,因为架构调整,需要对整个目录都进行调整,按照拆分,原有的mvc的映射路径需要批量修改。
考虑到项目已经是上线状态,需要同时兼容在线和开发版本。
解决方法
因为使用的是springMVC。所以不可避免的会用到RequestMapping注解字段。如果要修改的话有两种方案:
1、所有的新的都走新的URL,所有都重新创建一个Controller,然后实现的话跳转到原有的里面去。这种方案的话修改量太大,而且存在一些不可控的风险。
2、研究RequestMapping。看是否可以支持多URL,如果不支持的话,需要自己对这部分的代码进行定制。经研究,RequestMapping是支持多URL的。所以推荐使用方法二。
先简单看下RequestMapping的源码:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
我们看到代码里面,有个value和path的别名注解。(别名注解干啥用的,这里不作过多解释)
所以我们可以直接使用数组的方式来定义多个URL。以达到我们前面的兼容的目的。
// 实现方式1
@RequestMapping({"api/admin/wechat/program","api/sys/admin/wechat/program"})
// 实现方式2
@RequestMapping(value={"api/admin/wechat/program","api/sys/admin/wechat/program"})
// 实现方式3
@RequestMapping(path={"api/admin/wechat/program","api/sys/admin/wechat/program"})
以上是三种实现方式,效果是一样的,至于为什么是一样的, @AliasFor这个注解的功劳。至于@AliasFor,这个自行百度吧,就当是课后作业。
好了,问题至此完结!希望没有误导大伙