返回值处理器器【Spring源码学习】

devtools/2024/10/19 2:20:36/

定义返回值类型处理器的组合;

java">public static HandlerMethodReturnValueHandlerComposite getReturnValueHandler(){HandlerMethodReturnValueHandlerComposite composite = new HandlerMethodReturnValueHandlerComposite();// 处理ModelAndViewcomposite.addHandler(new ModelAndViewMethodReturnValueHandler());// 解析不加任何注解的返回把返回的String当作视图名composite.addHandler(new ViewNameMethodReturnValueHandler());// 处理带有@ModelAttribute注解的composite.addHandler(new ServletModelAttributeMethodProcessor(false));composite.addHandler(new HttpEntityMethodProcessor(List.of(new MappingJackson2HttpMessageConverter())));composite.addHandler(new HttpHeadersReturnValueHandler());// 将返回值当成响应体 然后经过MessageConverter转换为jsoncomposite.addHandler(new RequestResponseBodyMethodProcessor(List.of(new MappingJackson2HttpMessageConverter())));// 处理不带有@ModelAttribute注解的composite.addHandler(new ServletModelAttributeMethodProcessor(true));return composite;
}

测试使用的controller

java">static class Controller{public ModelAndView test1(){ModelAndView mav = new ModelAndView("view1");mav.addObject("name","张三");return mav;}public String test2(){return "view2";}
}

测试方法

java">public static void main(String[] args) throws Exception {AnnotationConfigApplicationContext context =new AnnotationConfigApplicationContext(WebConfig.class);Method method = Controller.class.getMethod("test1");Controller controller = new Controller();//返回值Object returnValue = method.invoke(controller);// 处理方法的类HandlerMethod methodHandle = new HandlerMethod(controller,method);// mav containerModelAndViewContainer container = new ModelAndViewContainer();HandlerMethodReturnValueHandlerComposite composite = getReturnValueHandler();// 判断当前返回值类型是否支持if (composite.supportsReturnType(methodHandle.getReturnType())) {composite.handleReturnValue(returnValue,methodHandle.getReturnType(),container,new ServletWebRequest(new MockHttpServletRequest()));}
}

MessageConverter

这个处理器会将数据转换为响应体数据;

java">composite.addHandler(new RequestResponseBodyMethodProcessor(List.of(new MappingJackson2HttpMessageConverter())));

在这里插入图片描述
通过MessageConverter将消息转换为json相应数据。
返回值处理器通过消息转换器将消息类型转为指定的格式;

如果一个返回值处理器中设置了多个消息转换器怎么进行转换呢?
在这里插入图片描述
对于这种情况如果默认请求头和contentType没有设置的话默认返回第一个消息类型;

request.addHeader("Accept","application/xml"); 如果设置了请求头那么这种情况会转为xml;
request.addHeader("application/json") 如果设置了contentType则这个优先级最高返回json;


http://www.ppmy.cn/devtools/57866.html

相关文章

elementui中日期/时间的禁用处理,使用传值的方式

项目中,经常会用到 在一个学年或者一个学期或者某一个时间段需要做的某件事情,则我们需要在创建这个事件的时候,需要设置一定的时间周期,那这个时间周期就需要给一定的限制处理,避免用户的误操作,优化用户体验 如下:需求为,在选择学年后,学期的设置需要在学年中,且结束时间大…

【Rust基础入门】Hello Cargo

文章目录 前言Cargo是什么?Cargo的作用查看cargo版本使用cargo创建项目Cargo.toml文件cargo build命令cargo runcargo check为发布构建 总结 前言 在Rust编程中,Cargo扮演着至关重要的角色。它是Rust的包管理器,负责处理许多任务&#xff0c…

论文辅助笔记:ST-LLM

1 时间嵌入 2 PFA(Partial Frozen Architecture) 3 ST_LLM 3.1 初始化 3.2 forward

three.js实现3D模型任意方向旋转

因为业务需要,我们在公司官网使用Three.js实现了可鼠标拖动任意旋转的3D旋转模型,可是实现之后发现除了Z轴方向都可以任意旋转,但是Z轴方向最多只能旋转180度。找遍全网也没有找到相关的资料来解释错在了哪一步,最终还是在github仓…

vue3+vite搭建第一个cesium项目详细步骤及环境配置(附源码)

文章目录 1.创建vuevite项目2.安装 Cesium2.1 安装cesium2.2 安装vite-plugin-cesium插件(非必选)2.3 新建组件页面map.vue2.4 加载地图 3.完成效果图 1.创建vuevite项目 打开cmd窗口执行以下命令:cesium-vue-app是你的项目名称 npm create…

唤醒知识循环,共筑绿色阅读梦——探索旧书回收小程序的无限可能

在这个信息爆炸的时代,书籍作为知识与智慧的载体,其重要性不言而喻。然而,随着电子阅读的兴起和书籍更新换代的加速,大量旧书被束之高阁,甚至面临被遗弃的命运。这不仅是对宝贵文化资源的浪费,也是对环境保…

vscode 快捷键

Visual Studio Code 快捷键大全(最全)-CSDN博客

C++:申明Declaration与定义Definition的本质与区别

在C中,声明和定义是两个不同的概念。 声明(Declaration) 声明是告诉编译器关于变量、函数等的存在以及它们的类型,但并不提供实际的存储空间或函数体。例如,你可以在程序的不同位置声明一个函数或者类,以…