> 文章列表 > Spring MVC 之 MethodArgumentResolver

Spring MVC 之 MethodArgumentResolver

Spring MVC 之 MethodArgumentResolver

        昨天的文章我们学习 MethodArgumentResolver ,它是采用一种策略模式,在 Handler 的方法被调用前,将 HTTP 请求中的参数转换成 Handler 方法的参数,今天我们将学习另外一种组件 MethodReturnValueHandler,用于将 Handler 返回的数据转换为 HTTP 响应

作用

        在Spring MVC中,当一个控制器方法执行完成后,它会返回一个数据对象,这个数据对象可以是任何类型,如对象、集合、数组、字符串等等。MethodReturnValueHandler 就是负责将这个数据对象转换为HTTP响应的。

源码实现

        在Spring MVC中,MethodReturnValueHandler 是一个接口,它有多个实现类,每个实现类都可以处理不同类型的数据对象。下面是一个简单的 MethodReturnValueHandler 的实现类示例

public class MyReturnValueHandler implements MethodReturnValueHandler {@Overridepublic boolean supportsReturnType(MethodParameter returnType) {return returnType.getParameterType().equals(MyData.class);}@Overridepublic void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {MyData myData = (MyData) returnValue;// do something with myDataHttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);response.getWriter().write("hello world");}
}

这个实现类可以将 MyData 类型的数据对象转换为 HTTP 响应。

supportsReturnType 方法用于判断该实现类是否支持处理指定类型的返回值。

handleReturnValue 方法用于将数据对象转换为 HTTP 响应。

在Spring MVC中,MethodReturnValueHandler 由 RequestMappingHandlerAdapter负责管理

        RequestMappingHandlerAdapter 会维护一个 MethodReturnValueHandler 列表,当控制器方法执行完成后,它会遍历这个列表,找到第一个支持处理当前返回值类型的 MethodReturnValueHandler,并调用它的 handleReturnValue 方法。

public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter {private final List<MethodReturnValueHandler> returnValueHandlers = new ArrayList<>();@Overridepublic void afterPropertiesSet() {super.afterPropertiesSet();this.returnValueHandlers.add(new MyReturnValueHandler());}@Overridepublic boolean supportsReturnType(MethodParameter returnType) {for (MethodReturnValueHandler handler : this.returnValueHandlers) {if (handler.supportsReturnType(returnType)) {return true;}}return false;}@Overrideprotected ModelAndView handleInternal(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {Object returnValue = handlerMethod.getMethod().invoke(handlerMethod.getBean(), handlerMethod.getMethodParameters());MethodParameter returnType = handlerMethod.getReturnType();for (MethodReturnValueHandler handler : this.returnValueHandlers) {if (handler.supportsReturnType(returnType)) {ModelAndViewContainer mavContainer = new ModelAndViewContainer();handler.handleReturnValue(returnValue, returnType, mavContainer, new ServletWebRequest(request, response));return mavContainer.getModelAndView();}}return null;}
}

在 RequestMappingHandlerAdapter 的 afterPropertiesSet 方法中,我们可以向returnValueHandlers 列表中添加自定义的 MethodReturnValueHandler 实现类。

supportsReturnType 方法用于判断当前返回值类型是否有对应的 MethodReturnValueHandler实 现类可以处理。

handleInternal 方法会在控制器方法执行完成后调用,它会根据返回值类型查找对应的 MethodReturnValueHandler 实现类,并调用它的 handleReturnValue 方法将数据对象转换为HTTP响应。

总结

MethodReturnValueHandler 是Spring MVC 中的一个拦截器,它的作用是根据方法的返回值,将数据转换为HTTP响应。

在Spring MVC中,MethodReturnValueHandler 由 RequestMappingHandlerAdapter 类负责管理。它会维护一个 MethodReturnValueHandler 列表,在控制器方法执行完成后,它会遍历这个列表,找到第一个支持处理当前返回值类型的 MethodReturnValueHandler,并调用它的handleReturnValue 方法。

我们可以自定义 MethodReturnValueHandler 实现类来处理特定类型的返回值。