需求
最近在写毕业设计,需要使用SpringBoot MyBatis来完成,在写的时候,本来是使用下面的代码来实现访问/api/user/get
这种形式的路由,但是发现每一次都要去重复写@RestController
和@RequestMapping
,一点也不优美,于是便想到了使用自定义注解来完成此功能。
@RestController
@RequestMapping("/api/user")
public class UserController {
@GetMapping("/test")
public Map<Object, Object> test() {
return Result.success("测试成功");
}
}
自定义注解类
像下图这样实现注解类,就自动集成了@RestController
和@RequestMapping
两个注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RestController
@RequestMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public @interface ApiRestController {
@AliasFor(annotation = RequestMapping.class)
String name() default "";
@AliasFor(annotation = RequestMapping.class)
String[] value() default {};
@AliasFor(annotation = RequestMapping.class)
String[] path() default {};
}
配置类
代码语言:java复制@Configuration
public class ApiPrefixAutoConfiguration implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// 使用自定义注解@ApiRestController时添加前缀/api
configurer.addPathPrefix("/api", c -> c.isAnnotationPresent(ApiRestController.class));
}
}
完成
这样的话,我们就可以使用@ApiRestController
来替换掉@RestController
和@RequestMapping
注释,而且还可以自动添加路由前缀,简直优美的不得了,使用效果就像下面这样:
代码语言:java复制http://127.0.0.1/api/user/test
@ApiRestController('/user')
public class UserController {
@GetMapping("/test")
public Map<Object, Object> test() {
return Result.success("测试成功");
}
}