SpringMVC MethodArgumentResolver的作用与实现方法是什么

这篇文章主要介绍“SpringMVC MethodArgumentResolver的作用与实现方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringMVC MethodArgumentResolver的作用与实现方法是什么”文章能帮助大家解决问题。

作用

在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响应。

关于“SpringMVC MethodArgumentResolver的作用与实现方法是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程之家行业资讯频道,小编每天都会为大家更新不同的知识点。

相关文章

这篇文章主要介绍了spring的事务传播属性REQUIRED_NESTED的原...
今天小编给大家分享的是一文解析spring中事务的传播机制,相...
这篇文章主要介绍了SpringCloudAlibaba和SpringCloud有什么区...
本篇文章和大家了解一下SpringCloud整合XXL-Job的几个步骤。...
本篇文章和大家了解一下Spring延迟初始化会遇到什么问题。有...
这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓...