SpringMvc-HttpMessageConverter接口

news/2024/7/7 19:10:39

虽然本文命题是HttpMessageConverter,但是常用的场景是修改字段值,如果不是,那你自定义Converter是为了什么???

HttpMessageConverter是也是数据绑定接口,它负责实现HandlerMethodArgumentResolver的内部实现,注意HandlerMethodArgumentResolver对于不同的媒体类型(MIME),有不同的实现,其中Converter主要针对常用的媒体类型为application/json的类型(当然这是自定义的,只不过spring mvc默认是这么做的),而如果是表单类型,则处理字段直接使用PropertyEditor接口即可

本文简单介绍一下HttpMessageConverter的常用实现类MappingJackson2HttpMessageConverter如何处理字段映射,假设有如下实体类

public class TestUser {

    private String userName;

    private String description;
	
	// 为了篇幅,省略get / set
	
    @Override
    public String toString() {
        return "TestUser{" +
                "userName='" + userName + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

下面的代码会打印出TestUser{userName='文天', description='想睡武汉的妹子'},这个例子很简单,因为这就是使用jackson将字符串转换成java类再打印出来

public static void main(String[] args) throws Exception {
    String str = "{\"userName\": \"文天\",\"description\": \"想睡武汉的妹子\"}";
    ObjectMapper objectMapper = new ObjectMapper();
    TestUser user = objectMapper.readValue(str, TestUser.class);
    System.out.println(user);
}

下面有这样一个需求,在不改变str的情况下,将输出改成TestUser{userName='文天', description='想睡武汉汉阳的妹子'},注意,多了汉阳两个字,这该如何做呢,比较简单(但是跟源码确实花费了我很久才知道),就是使用JsonDeserializer接口,首先定义一个字段接口,用来反序列化指定字段

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;

import java.io.IOException;

public class DesDeserializer extends JsonDeserializer<String> {

    @Override
    public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    	// 你可以在这里做任意的事情,不过本类专门用于放在description字段上,
    	// 所以示例直接返回写死的字符串
        System.out.println("deserialize:" + p.getCurrentName());
        System.out.println("deserialize:" + p.getValueAsString());
        return "想睡武汉汉阳的妹子";
    }
}

然后将实体类改成如下(多了一个注解),之后再次运行main方法即可输出TestUser{userName='文天', description='想睡武汉汉阳的妹子'}


public class TestUser {

    private String userName;

    @JsonDeserialize(using = DesDeserializer.class)
    private String description;

    @Override
    public String toString() {
        return "TestUser{" +
                "userName='" + userName + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

笔记:本文主要核心关注点就是对字段维度的解析,与本接口有相同类似作用的还有PropertyEditor接口,请注意二者在媒体类型上的区别


http://lihuaxi.xjx100.cn/news/1571474.html

相关文章

完成“重大项目”引进签约,美创科技正式落户中国(南京)软件谷

近日&#xff0c;美创科技正式入驻中国&#xff08;南京&#xff09;软件谷&#xff0c;并受邀出席中国南京“金洽会"之“雨花台区数字经济创新发展大会”。美创科技副总裁罗亮亮作为代表&#xff0c;在活动现场完成“重大项目”引进签约。 作为国家重要的软件产业与信息服…

JackJson多态

JsonTypeInfo 处理多态、序列化对象类型_赵丙双的博客-CSDN博客 JsonTypeInfo实现jackson的多态解析_MonkeyKing_sunyuhua的博客-CSDN博客 Java Jackson JsonTypeInfo 多态类型处理 - 简书 JsonTypeInfo 逻辑名称 JsonSubTypes、JsonTypeName_赵丙双的博客-CSDN博客

IoT 设备物联网通信中 NB-IoT、Cat.1、Cat.M 如何选型?

本篇文章介绍了物联网通信中涉及的NB-IoT、LTE-Cat.1 和 LTE-M &#xff0c;三种通信技术的各自优势&#xff0c;以及应用场景。 01 什么是 NB-IoT NB-IoT窄带物联网(Narrow Band Internet of Things)是 IoT 领域一个新兴的技术&#xff0c;支持低功耗设备在广域网的蜂窝数据连…

图像练习-计算平行线距离opencv(03)

原图 //对输入图像进行细化 cv::Mat ThinLine(const cv::Mat& matsrc, const int& iterations) {//CvSize size cvGetSize(src);cv::Mat dst matsrc.clone();//拷贝一个数组给另一个数组int _iwidth dst.cols;int _iheight dst.rows;int n 0, i 0, j 0;for (n …

【操作系统】24王道考研笔记——第五章 IO管理

第五章 IO管理 一、IO设备 1.1 基本概念与分类 1.2 IO控制器 电子部件 IO控制器组成 值得注意的小细节&#xff1a;①一个I/O控制器可能会对应多个设备&#xff1b; ②数据寄存器、控制寄存器、状态寄存器可能有多个&#xff08;如&#xff1a;每个控制/状态寄存器对应一个…

Elasticsearch:与多个 PDF 聊天 | LangChain Python 应用教程(免费 LLMs 和嵌入)

在本博客中&#xff0c;你将学习创建一个 LangChain 应用程序&#xff0c;以使用 ChatGPT API 和 Huggingface 语言模型与多个 PDF 文件聊天。 如上所示&#xff0c;我们在最最左边摄入 PDF 文件&#xff0c;并它们连成一起&#xff0c;并分为不同的 chunks。我们可以通过使用 …

https跳过SSL认证时是不是就是不加密的,相当于http?

https跳过SSL认证时是不是就是不加密的,相当于http?&#xff0c;其实不是&#xff0c;HTTPS跳过SSL认证并不相当于HTTP&#xff0c;也不意味着没有加密。请注意以下几点&#xff1a; HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;本质上是在HTTP的基础上…

计算机是怎么跑起来的(2)?程序如何驱动硬件工作的?

上文计算机是怎么跑起来的?从零开始手动组装微型计算机我们说了&#xff0c;如何手动从来组装一台计算机&#xff0c;那组装完后的计算机上是怎么跑起来程序的呢&#xff1f;程序是如何驱动硬件工作的&#xff1f; 前面我们通过DMA将代码输入到内存的指定位置&#xff0c;然后…