Spring Boot 2.7:如何避免未标注@Controller的Bean被识别为请求映射?
解决Spring将FooClient识别为Controller的问题
在Spring Boot 2.7版本中,默认情况下只要类实现了带有@RequestMapping注解的接口,并且本身是Spring组件(如标注@Component),就会被Spring MVC识别为Controller。要在保留FooApi接口上@RequestMapping的前提下避免FooClient被当作Controller,可采用以下方案:
方案一:自定义RequestMappingHandlerMapping,调整Controller识别规则
重写Spring MVC的RequestMappingHandlerMapping,修改其判断Controller的逻辑,仅将标注了@Controller或@RestController的类识别为Handler:
1. 自定义RequestMappingHandlerMapping实现
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; public class CustomRequestMappingHandlerMapping extends RequestMappingHandlerMapping { @Override protected boolean isHandler(Class<?> beanType) { // 仅识别带有@Controller或@RestController注解的类为Controller return beanType.isAnnotationPresent(org.springframework.stereotype.Controller.class) || beanType.isAnnotationPresent(org.springframework.web.bind.annotation.RestController.class); } }
2. 配置自定义Mapping到Spring容器
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; @Configuration public class WebConfig { @Bean public RequestMappingHandlerMapping requestMappingHandlerMapping() { return new CustomRequestMappingHandlerMapping(); } }
该方案核心是改变Spring MVC识别Controller的规则:原本只要类或其实现的接口带有@RequestMapping且是组件就会被识别,现在仅限定为标注了@Controller/@RestController的类。这样FooController因标注@RestController正常工作,FooClient仅为@Component不会被当作Controller。
方案二:备选方案:隔离客户端与服务端组件扫描范围
如果项目中客户端和服务端属于不同模块,可通过组件扫描的范围控制,让服务端模块仅扫描FooController所在包,客户端模块仅扫描FooClient所在包,避免Spring同时扫描到两个实现类后将客户端误识别为Controller。这种方式适合模块化拆分的项目,但灵活性不如方案一。
内容的提问来源于stack exchange,提问作者ST-DDT
相关产品推荐
相关产品推荐

