您的当前位置:首页 > 热点 > 正文

SpringMVC MethodArgumentResolver的作用与实现

  • 2023-04-12 05:52:30 来源:脚本之家
目录
作用源码实现总结

昨天的文章我们学习 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 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

标签:

推荐阅读

SpringMVC MethodArgumentResolver的作用与实现

这篇文章主要介绍了SpringMVCMethodArgumentResolver的作用与实现,MethodArgumentResolver采用一种策略...

4月11日基金净值:华泰柏瑞研究精选A最新净值1.5808,涨0.4%

4月11日,华泰柏瑞研究精选A最新单位净值为1 5808元,累计净值为1 5808元,较前一交易日上涨0 4%。历...

世界速讯:菱角需要煮多长时间?

菱角一般需煮15分钟左右即熟,需冷水下锅。具体需根据菱角大小和是否去壳区分:1、如煮新鲜带壳菱角,一...

【全球新要闻】湖南中医药大学学子获湖南省大学生计算机程序设计竞赛一等奖

新湖南客户端4月11日讯(通讯员张蕾李小智)近日,由湖南省教育厅主办、湖南省高等教育学会计算机教育专...

【天天新视野】兆新股份:截止至 2023-04-10,公司总户数为 129,299 户

兆新股份(002256)04月11日在投资者关系平台上答复了投资者关心的问题。

猜您喜欢

【版权及免责声明】凡注明"转载来源"的作品,均转载自其它媒体,转载目的在于传递更多的信息,并不代表本网赞同其观点和对其真实性负责。亚洲时报网倡导尊重与保护知识产权,如发现本站文章存在内容、版权或其它问题,烦请联系。 联系方式:8 86 239 5@qq.com,我们将及时沟通与处理。

关注