全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📅 2026-05-18 10 分钟 ✍️ juanwangdev

HandlerMapping与HandlerAdapter扩展

SpringMVC提供灵活的扩展点,允许自定义HandlerMapping实现特殊路由逻辑,自定义HandlerAdapter处理特殊Handler类型。

HandlerMapping扩展

自定义HandlerMapping

Java
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomHandlerMapping implements HandlerMapping, Ordered {

    private final Map<String, HandlerMethod> handlerMap = new HashMap<>();

    @Override
    public HandlerExecutionChain getHandler(HttpServletRequest request) {
        String path = request.getRequestURI();

        // 自定义路由逻辑
        HandlerMethod handlerMethod = handlerMap.get(path);
        if (handlerMethod != null) {
            HandlerExecutionChain chain = new HandlerExecutionChain(handlerMethod);
            // 添加拦截器
            chain.addInterceptor(new CustomInterceptor());
            return chain;
        }

        return null; // 不处理,交给下一个HandlerMapping
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

扩展RequestMappingHandlerMapping

Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addRequestMappingHandlerMapping(RequestMappingHandlerMapping handlerMapping) {
        // 自定义路径匹配规则
        handlerMapping.setUseSuffixPatternMatch(false);
        handlerMapping.setUseTrailingSlashMatch(true);

        // 自定义路径处理器
        handlerMapping.setPathMatcher(new AntPathMatcher());
    }

    @Override
    public void extendHandlerMappings(List<HandlerMapping> handlerMappings) {
        // 添加自定义HandlerMapping到链
        handlerMappings.add(new CustomHandlerMapping());
    }
}

动态注册Handler

Java
@Component
public class DynamicHandlerRegistry implements ApplicationContextAware {

    private RequestMappingHandlerMapping handlerMapping;
    private ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        this.applicationContext = applicationContext;
        this.handlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
    }

    public void registerHandler(String path, Object handler, Method method) {
        // 创建RequestMappingInfo
        RequestMappingInfo mappingInfo = RequestMappingInfo
            .paths(path)
            .methods(RequestMethod.GET)
            .build();

        // 创建HandlerMethod
        HandlerMethod handlerMethod = new HandlerMethod(handler, method);

        // 动态注册
        handlerMapping.registerMapping(mappingInfo, handler, method);
    }

    public void unregisterHandler(String path) {
        RequestMappingInfo mappingInfo = RequestMappingInfo.paths(path).build();
        handlerMapping.unregisterMapping(mappingInfo);
    }
}

HandlerAdapter扩展

自定义HandlerAdapter

Java
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CustomHandlerAdapter implements HandlerAdapter, Ordered {

    @Override
    public boolean supports(Object handler) {
        // 支持自定义Handler类型
        return handler instanceof CustomHandler;
    }

    @Override
    public ModelAndView handle(HttpServletRequest request,
            HttpServletResponse response, Object handler) {
        CustomHandler customHandler = (CustomHandler) handler;

        // 自定义调用逻辑
        Object result = customHandler.execute(request, response);

        // 处理返回结果
        if (result instanceof String) {
            return new ModelAndView((String) result);
        } else if (result instanceof ModelAndView) {
            return (ModelAndView) result;
        } else {
            response.setContentType("application/json");
            response.getWriter().write(toJson(result));
            return null;
        }
    }

    @Override
    public long getLastModified(HttpServletRequest request, Object handler) {
        return -1;
    }

    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

自定义Handler类型

Java
// 定义自定义Handler接口
public interface CustomHandler {
    Object execute(HttpServletRequest request, HttpServletResponse response);
}

// 实现示例
@Controller
public class ApiController {
    @CustomMapping("/api/v1/users")
    public CustomHandler getUserHandler() {
        return (request, response) -> {
            String id = request.getParameter("id");
            User user = userService.getById(Long.parseLong(id));
            return user;
        };
    }
}

扩展RequestMappingHandlerAdapter

Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addRequestMappingHandlerAdapter(RequestMappingHandlerAdapter handlerAdapter) {
        // 自定义参数解析器
        List<HandlerMethodArgumentResolver> resolvers = new ArrayList<>();
        resolvers.add(new CustomArgumentResolver());
        handlerAdapter.setCustomArgumentResolvers(resolvers);

        // 自定义返回值处理器
        List<HandlerMethodReturnValueHandler> handlers = new ArrayList<>();
        handlers.add(new CustomReturnValueHandler());
        handlerAdapter.setCustomReturnValueHandlers(handlers);
    }
}

自定义参数解析器

Java
public class CustomArgumentResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 支持@CurrentUser注解
        return parameter.hasParameterAnnotation(CurrentUser.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter,
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
            WebDataBinderFactory binderFactory) {

        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);

        // 从Session获取当前用户
        User user = (User) request.getSession().getAttribute("currentUser");

        if (user == null) {
            throw new UnauthorizedException("用户未登录");
        }

        return user;
    }
}

// 注解定义
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentUser {
}

// 使用示例
@GetMapping("/profile")
public User profile(@CurrentUser User user) {
    return user;
}

自定义返回值处理器

Java
public class CustomReturnValueHandler implements HandlerMethodReturnValueHandler {

    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        // 支持@ApiResponse注解
        return returnType.hasMethodAnnotation(ApiResponse.class);
    }

    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType,
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest) {

        HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
        response.setContentType("application/json;charset=UTF-8");

        ApiResponse annotation = returnType.getMethodAnnotation(ApiResponse.class);

        // 构建响应包装
        ApiResponseWrapper wrapper = new ApiResponseWrapper();
        wrapper.setCode(annotation.code());
        wrapper.setMessage(annotation.message());
        wrapper.setData(returnValue);

        try {
            response.getWriter().write(toJson(wrapper));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        mavContainer.setRequestHandled(true);
    }
}

// 注解定义
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ApiResponse {
    int code() default 200;
    String message() default "success";
}

// 使用示例
@GetMapping("/users/{id}")
@ApiResponse(code = 200, message = "获取用户成功")
public User getUser(@PathVariable Long id) {
    return userService.getById(id);
}

注册扩展组件

Java
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new CustomArgumentResolver());
    }

    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> handlers) {
        handlers.add(new CustomReturnValueHandler());
    }
}

扩展组件执行顺序

text
请求到达
    ↓
遍历HandlerMapping链
    ├─ CustomHandlerMapping (order=最高优先级)
    │   ↓ 返回null
    ├─ RequestMappingHandlerMapping
    │   ↓ 返回HandlerExecutionChain
    ↓
遍历HandlerAdapter链
    ├─ CustomHandlerAdapter (supports=CustomHandler)
    │   ↓ 处理CustomHandler
    ├─ RequestMappingHandlerAdapter
    │   ↓ 处理HandlerMethod
    ↓
参数解析 → CustomArgumentResolver
    ↓
Handler执行
    ↓
返回值处理 → CustomReturnValueHandler

扩展点对比

扩展点作用适用场景
HandlerMapping请求路由映射自定义路由规则、动态注册
HandlerAdapterHandler调用适配支持新Handler类型
ArgumentResolver参数绑定自定义参数解析逻辑
ReturnValueHandler返回值处理自定义响应格式

HandlerMapping和HandlerAdapter通过supports方法判断是否处理,返回null交给下一个组件。

要点总结

  1. 自定义HandlerMapping实现特殊路由逻辑
  2. 自定义HandlerAdapter支持新的Handler类型
  3. ArgumentResolver扩展参数绑定机制
  4. ReturnValueHandler扩展响应处理方式
  5. 通过Order控制组件执行优先级

jwdev/articles/SPRINGMVC/专家/容器级WEB组件扩展/容器级WEB组件扩展/HandlerMapping与HandlerAdapter扩展.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 HandlerMapping
下一篇 → SpringMVC容器初始化与DispatcherServlet
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库