当前位置: 首页 > news >正文

Java --- springboot2数据响应与内容协商

目录

一、数据响应与内容协商

 1.1、响应json

1.1.1、返回值解析器

1.1.2、springMVC支持的返回值类型

 1.1.3、HttpMessageConverter原理

 1.2、内容协商

1.2.1、引入依赖

1.2.2、 postman分别测试返回json和xml

1.2.3、开启浏览器参数方式内容协商功能

 1.3、自定义 MessageConverter


一、数据响应与内容协商

 1.1、响应json

<!--web场景--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

 给前端自动返回json数据

1.1.1、返回值解析器

 

try {this.returnValueHandlers.handleReturnValue(returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}

 

@Override
public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);if (handler == null) {throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());}handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
}

RequestResponseBodyMethodProcessor      
@Override
    public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
            ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
            throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {

        mavContainer.setRequestHandled(true);
        ServletServerHttpRequest inputMessage = createInputMessage(webRequest);
        ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);

        // Try even with null return value. ResponseBodyAdvice could get involved.
        // 使用消息转换器进行写出操作
        writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
    }

 

1、 返回值处理器判断是否支持这种类型返回值supportsReturnType。

2、返回值处理器调用handleReturnValue进行处理。

3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。

    • 1. 利用 MessageConverters 进行处理 将数据写为json
      • 1、内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)
      • 2、服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,
      • 3、SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理?
  • 1、得到MappingJackson2HttpMessageConverter可以将对象写为json
    • 2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。

1.1.2、springMVC支持的返回值类型

ModelAndView
Model
View
ResponseEntity 
ResponseBodyEmitter
StreamingResponseBody
HttpEntity
HttpHeaders
Callable
DeferredResult
ListenableFuture
CompletionStage
WebAsyncTask
有 @ModelAttribute 且为对象类型的
@ResponseBody 注解 ---> RequestResponseBodyMethodProcessor; 

 1.1.3、HttpMessageConverter原理

MessageConverter规范

 

HttpMessageConverter: 看是否支持将 此 Class类型的对象,转为MediaType类型的数据。

例子:Person对象转为JSON。或者 JSON转为Person

默认的MessageConverter 

 

0 - 只支持Byte类型的

1 - String

2 - String

3 - Resource

4 - ResourceRegion

5 - DOMSource.class \ SAXSource.class) \ StAXSource.class \StreamSource.class \Source.class

6 - MultiValueMap

7 - true

8 - true

9 - 支持注解方式xml处理的。

最终 MappingJackson2HttpMessageConverter 把对象转为JSON(利用底层的jackson的objectMapper转换的)

 1.2、内容协商

1.2.1、引入依赖

<!--xml依赖--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId></dependency>

1.2.2、 postman分别测试返回json和xml

1.2.3、开启浏览器参数方式内容协商功能

 1.3、自定义 MessageConverter

/*** 自定义Converter*/
public class CJCMessageConverter implements HttpMessageConverter<Persons> {@Overridepublic boolean canRead(Class clazz, MediaType mediaType) {return false;}@Overridepublic boolean canWrite(Class clazz, MediaType mediaType) {return clazz.isAssignableFrom(Persons.class);}/*** 服务器要统计所有的MessageConverter都能写出那些类容* @return*/@Overridepublic List<MediaType> getSupportedMediaTypes() {return MediaType.parseMediaTypes("application/x-cjc");}@Overridepublic Persons read(Class<? extends Persons> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {return null;}@Overridepublic void write(Persons persons, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {//自定义协议数据写出String  data =  persons.getUserName()+";"+persons.getAge()+";"+ persons.getBirth();//写出去OutputStream body = outputMessage.getBody();body.write(data.getBytes());}
}
        /*** 自定义内容协商策略* @param configurer*/@Overridepublic void configureContentNegotiation(ContentNegotiationConfigurer configurer) {HashMap<String, MediaType> mediaTypeHashMap = new HashMap<>();mediaTypeHashMap.put("json",MediaType.APPLICATION_JSON);mediaTypeHashMap.put("xml",MediaType.APPLICATION_XML);mediaTypeHashMap.put("cjc",MediaType.parseMediaType("application/x-cjc"));//指定支持解析那些参数对应的那些类型ParameterContentNegotiationStrategy parameterStrategy = new ParameterContentNegotiationStrategy(mediaTypeHashMap);HeaderContentNegotiationStrategy headerStrategy = new HeaderContentNegotiationStrategy();configurer.strategies(Arrays.asList(parameterStrategy,headerStrategy));}@Overridepublic void extendMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new CJCMessageConverter());}

 

 

 

 

 

 

 

 

 

相关文章:

Java --- springboot2数据响应与内容协商

目录 一、数据响应与内容协商 1.1、响应json 1.1.1、返回值解析器 1.1.2、springMVC支持的返回值类型 1.1.3、HttpMessageConverter原理 1.2、内容协商 1.2.1、引入依赖 1.2.2、 postman分别测试返回json和xml 1.2.3、开启浏览器参数方式内容协商功能 1.3、自定义 Message…...

“中特估”乘风破浪!后续机遇在哪?

5月第一个交易日&#xff0c;“中特估”继续乘风破浪&#xff0c;A股银行板块集体大涨。 随着新一轮国企改革正在推进&#xff0c;中特估体系也在积极构建之中。在市场缺乏增量资金背景下&#xff0c;市场选股范式已经转向数字经济AI、央国企价值重估的两条主线&#xff0c;此…...

OpenShift 4 - 在 CI/CD Pipeline 中创建 KubeVirt 容器虚拟机 - 方法3

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在支持 OpenShift 4.12 的 OpenShift 环境中验证 文章目录 创建并运行 CI/CD Pipeline访问 VMPipeline 的 Task 解读 创建并运行 CI/CD Pipeline 执行命令&#xff0c;生成公钥-私钥对。 $ ssh-keygen$ l…...

功率放大器在Lamb波信号波包模型验证研究中的应用

实验名称&#xff1a;窄带激励条件下的兰姆波时域信号参数估计研究 研究方向&#xff1a;Lamb波 测试目的&#xff1a; 基于Lamb波的二阶频散理论&#xff0c;提出了时域信号的波包模型&#xff0c;为全文奠定理论基础。模型考虑两种情况&#xff1a;初始激励以单模态传播和…...

Apache Hadoop

一、Apache Hadoop入门 1.1、Hadoop介绍 狭义上&#xff1a;hadoop指的是Apache一款java开源软件&#xff0c;是一个大数据分析处理平台。 Hadoop HDFS&#xff1a;分布式文件系统。 解决了海量数据存储问题。 Hadoop Distributed File System (HDFS™)Hadoop MapReduce&…...

PHP+vue大学生心理健康评价和分析系统8w3ff

本整个大学生心理健康管理系统是按照整体需求来实现各个功能的&#xff0c;它可以通过心理健康测评来检测大学生的心理健康&#xff0c;并且给予预警&#xff0c;还可以预约医生来解决问题。并且&#xff0c;管理员可以查看用户信息&#xff0c;发布一些关于心理健康的文章。该…...

【图像分割】【深度学习】SAM官方Pytorch代码-Mask decoder模块MaskDeco网络解析

【图像分割】【深度学习】SAM官方Pytorch代码-Mask decoder模块MaskDeco网络解析 Segment Anything&#xff1a;建立了迄今为止最大的分割数据集&#xff0c;在1100万张图像上有超过1亿个掩码&#xff0c;模型的设计和训练是灵活的&#xff0c;其重要的特点是Zero-shot(零样本迁…...

A Restful API

SpringBoot 定义Restful API 定义POJOOrderBuyer 定义RestfulControllerGet API for queryPost API for addPut API for updateDelete API for delete 定义AjaxResponse Patavariable RequestParm RequestBodyRequestHeader 定义POJO Order import java.util.Date; import ja…...

从零开始学习JSP,让你全面掌握Web开发技能

JSP&#xff08;Java Server Pages&#xff09;&#xff0c;是一种动态网页技术&#xff0c;它允许开发者使用Java代码和HTML标签来创建网页。在这篇文章中&#xff0c;我们将详细介绍JSP的基本概念、语法和应用。 一、JSP的基本概念 1.1 JSP的含义 JSP是一种网页技术&#…...

java基于知识库的中医药问询系统

本系统主要包含了等系统用户管理、中医药常识管理、科室信息管理、知识库管理多个功能模块。下面分别简单阐述一下这几个功能模块需求。 管理员的登录模块&#xff1a;管理员登录系统对本系统其他管理模块进行管理。 用户的登录模块&#xff1a;用户登录本系统&#xff0c;对个…...

【新星计划-2023】什么是ARP?详解它的“解析过程”与“ARP表”。

一、什么是ARP ARP&#xff08;地址解析协议&#xff09;英文全称“Address Resolution Protocol”&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确…...

自动驾驶行业观察之2023上海车展-----车企发展趋势(2)

自主品牌发展 比亚迪&#xff1a;展示3款新车&#xff0c;均于2023年年内上市 比亚迪在本次展会上推出了3款新车&#xff1a;宋L概念车&#xff08;王朝系列&#xff09;、驱逐舰07&#xff08;海洋系列&#xff09;、海鸥&#xff08;海洋系列&#xff09;。 • 宋L&#x…...

通知所有员工所需的时间

题目描述 公司里有 n 名员工&#xff0c;每个员工的 ID 都是独一无二的&#xff0c;编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。 在 manager 数组中&#xff0c;每个员工都有一个直属负责人&#xff0c;其中 manager[i] 是第 i 名员工的直属负责人。对于总负责…...

Docker:bash: vim: command not found

进入docker容器 docker exec -it [容器ID] /bin/bash docker exec -it e56e7bbe85ad /bin/bash 在使用 Docker 容器时&#xff0c;有时候里边没有安装vim&#xff0c;敲vim命令时提示说&#xff1a;vim: command not found&#xff0c;这个时候就需要安装vim&#xff0c;可是…...

排序算法之选择排序

选择排序&#xff08;Selection Sort&#xff09;是一种简单直观的排序算法&#xff0c;其基本思路是在未排序的数据序列中找到最小元素&#xff0c;将其放在已排序的数据序列的末尾。重复该过程&#xff0c;直到整个序列排序完成。 具体实现过程如下&#xff1a; 首先&#x…...

5_服务编排_docker-compose

服务编排之Docker Compose 微服务架构的应用系统中一般包含若干个微服务&#xff0c;每个微服务一般都会部署多个实例&#xff0c;如果每个微服务都要手动启停&#xff0c;维护的工作量会很大。 要从Dockerfile build image 或者去dockerhub拉取image 要创建多个container 要…...

Java基本数据类型以及包装类型的常量池技术

Java 中的基本数据类型 Java 中有 8 种基本数据类型&#xff0c;分别为&#xff1a; 6 种数字类型&#xff1a; 4 种整数型&#xff1a;byte、short、int、long2 种浮点型&#xff1a;float、double 1 种字符类型&#xff1a;char1 种布尔型&#xff1a;boolean。 这 8 种基本…...

P1054 [NOIP2005 提高组] 等价表达式

题目描述 明明进了中学之后&#xff0c;学到了代数表达式。有一天&#xff0c;他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式&#xff0c;然后列出了若干选项&#xff0c;每个选项也是一个代数表达式&#xff0c;题目的要求是判断选项中哪些代数表达式…...

什么牌子蓝牙耳机好用不贵?国产性价比高的蓝牙耳机推荐

相较于有线耳机&#xff0c;无线蓝牙耳机更便携、功能更丰富&#xff0c;不用受到耳机孔与线的限制。那么&#xff0c;什么牌子的蓝牙耳机好用不贵&#xff1f;针对这个问题&#xff0c;我给大家推荐几款国产性价比高的蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱Lite…...

明明花钱上了ERP,为什么还要我装个MES系统

目前&#xff0c; ERP系统依旧是很多制造企业的选择。据统计&#xff0c;ERP系统的应用已经达到70&#xff05;以上&#xff0c;但是在车间的应用&#xff0c; MES系统的应用比例并不高。那么&#xff0c;为什么现在很多企业又都选择再上个MES呢&#xff1f; MES系统是一个面向…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...