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 | 请求路由映射 | 自定义路由规则、动态注册 |
| HandlerAdapter | Handler调用适配 | 支持新Handler类型 |
| ArgumentResolver | 参数绑定 | 自定义参数解析逻辑 |
| ReturnValueHandler | 返回值处理 | 自定义响应格式 |
HandlerMapping和HandlerAdapter通过supports方法判断是否处理,返回null交给下一个组件。
要点总结
- 自定义HandlerMapping实现特殊路由逻辑
- 自定义HandlerAdapter支持新的Handler类型
- ArgumentResolver扩展参数绑定机制
- ReturnValueHandler扩展响应处理方式
- 通过Order控制组件执行优先级
jwdev/articles/SPRINGMVC/专家/容器级WEB组件扩展/容器级WEB组件扩展/HandlerMapping与HandlerAdapter扩展.md
📝 发现内容有误?点击此处直接编辑