前言
上一篇文章介绍了SpringMvc的RequestMappingHandlerMapping,自定义了Controller和RequestMapping。 这里再介绍一下HandlerAdapter和HttpMessageConverter,并通过自定义注解来实现RequestBody和ResponseBody。HttpMessageConverter最常见的应用就是json的decode和encode。
RequestBody和ResponseBody
上一篇文章介绍了RequestMappingHandlerMapping在DispatcherServlet的作用。 RequestMappingHandlerMapping扫描了RequestMapping注释的HttpRequest对应的处理方法,并通过实现HandlerMapping的接口代理对应的方法。 而HandlerAdapter则是封装了HandlerMapping的方法,并围绕HandlerMapping实现一些嵌入操作。 RequestMappingHandlerAdapter是其中一个典型的例子,这个类包含HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler的一些实现类来处理RequestMapping的参数和返回值。
private HandlerMethodArgumentResolverComposite argumentResolvers;
private HandlerMethodReturnValueHandlerComposite returnValueHandlers;
RequestResponseBodyMethodProcessor是HandlerAdapter的内部一个重要的类,这个类同时实现了HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler。 其中HandlerMethodArgumentResolver接口有两个方法。
public interface HandlerMethodArgumentResolver {
boolean supportsParameter(MethodParameter parameter);
Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception;
}
HandlerMethodReturnValueHandler接口同样也有两个方法。
public interface HandlerMethodReturnValueHandler {
boolean supportsReturnType(MethodParameter returnType);
void handleReturnValue(Object returnValue, MethodParameter returnType,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;
}
所以从RequestResponseBodyMethodProcessor实现的方法,就可以看出来这个类,会处理被*@RequestBody注解的参数,和@ResponseBody*注解的返回值。
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(RequestBody.class);
}
@Override
public boolean supportsReturnType(MethodParameter returnType) {
return (AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null ||
returnType.getMethodAnnotat