You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 15:12:01