Spring MVC 之 HttpMessageConverter
Spring MVC 为开发者提供了方便的开发方式和丰富的功能。其中,HttpMessageConverter 是 Spring MVC 中非常重要的一个组件,它负责将客户端提交的请求数据(如 JSON、XML 等)转换为 Java 对象,同时也负责将 Java 对象转换为客户端需要的数据格式。本文将 从 HttpMessageConverter 的作用和源码实现两个方面进行讲解。
作用
在 Spring MVC 中,客户端通过发送请求,向服务器端请求数据,服务器端接收到请求后需要将请求参数转换为 Java 对象进行处理,这就需要使用 HttpMessageConverter,它主要负责将 HTTP 请求中的请求参数转换为 Java 对象或将 Java 对象转换为 HTTP 响应中的内容。
HttpMessageConverter 是一个接口,Spring MVC 中有很多实现类,用于处理不同的数据类型。常见的 HttpMessageConverter 实现类有:
ByteArrayHttpMessageConverter:用于处理字节数组类型的数据。
StringHttpMessageConverter:用于处理字符串类型的数据。
FormHttpMessageConverter:用于处理表单类型的数据。
MappingJackson2HttpMessageConverter:用于处理 JSON 类型的数据。
Jaxb2RootElementHttpMessageConverter:用于处理 XML 类型的数据。
HttpMessageConverter 接口定义了两个方法:canRead() 和 canWrite(),分别用于判断当前的 HttpMessageConverter 是否可以读取或写入指定的数据类型。
如果 canRead() 方法返回 true,那么当前的 HttpMessageConverter 就可以将 HTTP 请求中的请求参数转换为 Java 对象;
如果 canWrite() 方法返回 true,那么当前的 HttpMessageConverter 就可以将 Java 对象转换为 HTTP 响应中的内容。
源码实现
下面以 MappingJackson2HttpMessageConverter 为例,讲解 HttpMessageConverter 的源码实现。
MappingJackson2HttpMessageConverter 是一个用于处理 JSON 类型数据的 HttpMessageConverter 实现类。它继承了 AbstractJackson2HttpMessageConverter 类,并实现了 HttpMessageConverter 接口。
canRead()
方法首先调用了 getJavaType() 方法获取 JavaType 对象,然后判断当前的 ObjectMapper 是否可以反序列化 JavaType 对象。
如果当前的 HttpMessageConverter 可以反序列化 JavaType 对象并且当前的 MediaType 可以被处理,那么就返回 true,否则返回 false。
canWrite()
方法首先判断当前的 ObjectMapper 是否可以序列化指定的 Java 对象。
如果可以序列化并且当前的 MediaType 可以被处理,那么就返回 true,否则返回 false。
read()
方法首先调用 getJavaType() 方法获取 JavaType 对象,然后通过 ObjectMapper 的 readValue() 方法将 HTTP 请求中的请求参数转换为 Java 对象。
如果在转换的过程中出现了异常,那么就抛出 HttpMessageNotReadableException 异常。
write()
方法首先通过 getJsonEncoding() 方法获取 JSON 编码格式,然后通过 ObjectMapper 的 writeValue() 方法将 Java 对象转换为 JSON 格式的字符串,并将结果输出到 HTTP 响应中。如果在转换的过程中出现了异常,那么就抛出 HttpMessageNotWritableException 异常。
异同
大家是不是觉得与前面文章所讲的 MethodArgumentResolver 很相似,都能够将请求参数转换为 Java 对象,但它们的作用和处理流程不同:
HttpMessageConverter 会在请求到达 Controller 方法之前进行处理,这意味着它只处理请求参数,而不管 Controller 方法的签名和参数类型;
MethodArgumentResolver 会在 Controller 方法执行之前进行处理,它的作用是将请求参数按照 Controller 方法的参数顺序进行解析,并将解析结果映射到 Controller 方法的参数上,然后再调用 Controller 方法
总结
HttpMessageConverter 是 Spring MVC 中非常重要的一个组件,它主要负责将 HTTP 请求中的请求参数转换为 Java 对象或将 Java 对象转换为 HTTP 响应中的内容。Spring MVC 中提供了很多 HttpMessageConverter 实现类,可以处理不同的数据类型。
HttpMessageConverter 接口定义了两个方法:canRead() 和 canWrite(),分别用于判断当前的 HttpMessageConverter 是否可以读取或写入指定的数据类型。HttpMessageConverter 的源码实现中,read() 方法用于将 HTTP 请求中的请求参数转换为 Java 对象,write() 方法用于将 Java 对象转换为 HTTP 响应中的内容。在具体实现中,开发者可以根据自己的需求自定义 HttpMessageConverter 实现类。
作者:这堆干货有点猛
链接:https://juejin.cn/post/7216495812578050109
来源:稀土掘金
评论