SpringBoot 默认的 RequestMappingHandlerMapping 实现会扫描项目目录下的所有带有 @Controller 和 @RequestMapping 类进行处理.
RequestMappingHandlerMapping.isHandler
@Override
protected boolean isHandler(Class<?> beanType) {
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
}
由于我们的项目中 在 web.controller 包之外的其他类中也会用到@RequestMapping 注解,但是这里面的并不是项目需要对外提供的路径,因此需要将这些类型的类过滤掉。
这里需要定义自己的扫描方式,只需要重写 isHandler 方法只扫描我们项目中提供接口的类即可:
public class RestRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected boolean isHandler(Class<?> beanType) {
return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
AnnotatedElementUtils.hasAnnotation(beanType, RestController.class));
}
}
由于们的项目中对外接口都使用了 @RestController 注解,所以不需要扫描带有 @RequestMapping 的类,如果大家的项目比较复杂,可以尝试通过自定义注解的方式解决这个问题。
配置MVC
@Configuration()
public class WebConfig extends DelegatingWebMvcConfiguration{
@Override
protected RequestMappingHandlerMapping createRequestMappingHandlerMapping() {
return new RestRequestMappingHandlerMapping();
}
}
这里我们继承了 DelegatingWebMvcConfiguration 类并重写 createRequestMappingHandlerMapping() 方法即可,这里需要特别注意的是不能使用 @EnableWebMvc 注解。
本文介绍如何在SpringBoot项目中自定义RequestMappingHandlerMapping,通过重写isHandler方法来过滤不需要作为控制器处理的类,确保只有指定的接口类被扫描。
3252

被折叠的 条评论
为什么被折叠?



