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