SpringMVC MethodArgumentResolver的作用与实现

 更新时间:2023年04月11日 10:42:17   作者:这堆干货有点猛  
这篇文章主要介绍了SpringMVC MethodArgumentResolver的作用与实现,MethodArgumentResolver采用一种策略模式,在Handler的方法被调用前,Spring MVC会自动将HTTP请求中的参数转换成方法参数

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

作用

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

源码实现

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

public class MyReturnValueHandler implements MethodReturnValueHandler {
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        return returnType.getParameterType().equals(MyData.class);
    }
    @Override
    public void handleReturnValue(Object returnValue, MethodParameter returnType, ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
        MyData myData = (MyData) returnValue;
        // do something with myData
        HttpServletResponse 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<>();
    @Override
    public void afterPropertiesSet() {
        super.afterPropertiesSet();
        this.returnValueHandlers.add(new MyReturnValueHandler());
    }
    @Override
    public boolean supportsReturnType(MethodParameter returnType) {
        for (MethodReturnValueHandler handler : this.returnValueHandlers) {
            if (handler.supportsReturnType(returnType)) {
                return true;
            }
        }
        return false;
    }
    @Override
    protected 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 实现类来处理特定类型的返回值。

到此这篇关于SpringMVC MethodArgumentResolver的作用与实现的文章就介绍到这了,更多相关SpringMVC MethodArgumentResolver内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的BlockingQueue阻塞队列原理以及实现详解

    Java中的BlockingQueue阻塞队列原理以及实现详解

    这篇文章主要介绍了Java中的BlockingQueue阻塞队列原理以及实现详解,在最常见的使用到这个阻塞队列的地方,就是我们耳熟能详的线程池里面了,作为我们线程池的一大最大参与者,也是AQS的一个具体实现,需要的朋友可以参考下
    2023-12-12
  • 浅谈@Aspect@Order各个通知的执行顺序

    浅谈@Aspect@Order各个通知的执行顺序

    这篇文章主要介绍了@Aspect@Order各个通知的执行顺序,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java中io流解析及代码实例

    Java中io流解析及代码实例

    这篇文章主要介绍了Java中io流解析及代码实例,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • swagger文档增强工具knife4j使用图文详解

    swagger文档增强工具knife4j使用图文详解

    这篇文章主要介绍了swagger文档增强工具knife4j使用详解,想要使用knife4j非常简单,只要在Springboot项目中引入knife4j的依赖即可,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • SpringBoot集成minio实现文件上传和删除功能

    SpringBoot集成minio实现文件上传和删除功能

    这篇文章主要介绍了SpringBoot集成minio实现文件上传和删除功能,详细介绍每个功能的实现步骤和代码示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • Zookeeper和Eureka哪个更好?

    Zookeeper和Eureka哪个更好?

    今天小编就为大家分享一篇关于Zookeeper和Eureka哪个更好?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • 图文详解mybatis+postgresql平台搭建步骤

    图文详解mybatis+postgresql平台搭建步骤

    从头开始搭建一个mybatis+postgresql平台,这篇文章主要介绍了图文详解mybatis+postgresql平台搭建步骤,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • IntelliJ Idea2017如何修改缓存文件的路径

    IntelliJ Idea2017如何修改缓存文件的路径

    这篇文章主要介绍了IntelliJ Idea2017如何修改缓存文件的路径,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • 详解Java的MyBatis框架中SQL语句映射部分的编写

    详解Java的MyBatis框架中SQL语句映射部分的编写

    这篇文章主要介绍了Java的MyBatis框架中SQL语句映射部分的编写,文中分为resultMap和增删查改实现两个部分来讲解,需要的朋友可以参考下
    2016-04-04
  • 解析Spring RestTemplate必须搭配MultiValueMap的理由

    解析Spring RestTemplate必须搭配MultiValueMap的理由

    本文给大家介绍Spring RestTemplate必须搭配MultiValueMap的理由,本文通过实例图文相结合给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11

最新评论