MENU

SpingBoot使用自定义注解实现给Controller添加指定路径前缀

• May 17, 2022 • 日常

需求

最近在写毕业设计,需要使用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 {};

}

配置类

@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注释,而且还可以自动添加路由前缀,简直优美的不得了,使用效果就像下面这样:

http://127.0.0.1/api/user/test
@ApiRestController('/user')
public class UserController {
    
    @GetMapping("/test")
    public Map<Object, Object> test() {
        return Result.success("测试成功");
    }
    
}
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

已有 1 条评论
  1. 腾讯云开发者社区

    您好~我是腾讯云开发者社区的运营,关注了您分享的技术文章,觉得内容很棒,我们诚挚邀请您加入腾讯云自媒体分享计划。完整福利和申请地址请见:https://cloud.tencent.com/developer/support-plan
    作者申请此计划后将作者的文章进行搬迁同步到社区的专栏下,你只需要简单填写一下表单申请即可,我们会给作者提供包括流量、云服务器等,另外还有些周边礼物