被坑过后才知道HttpMessageConverter多重要( 二 )
对 , 没错 , 这就解决了 , MappingJackson2HttpMessageConverter也是一个HttpMessageConverter转换类 , 但是他不能处理text/html的数据 , 原因是他的父类AbstractHttpMessageConverter中的supportedMediaTypes集合中没有text/html类型 , 如果有的话就能处理了 , 通过setSupportedMediaTypes可以给他指定一个新的MediaType集合 , 上面的写法会导致MappingJackson2HttpMessageConverter只能处理text/html类型的数据 。
但是 , 为了更深的研究 , 我们要直接继承HttpMessageConverter(当然更推荐的是继承AbstractHttpMessageConverter)来实现,在此之前 , 先看这几个方法具体代表什么意思 , 才能继续往下写 。
public interface HttpMessageConverter {/*** 根据mediaType判断clazz是否可读*/boolean canRead(Class> clazz, @Nullable MediaType mediaType);/*** 根据mediaType判断clazz是否可写*/boolean canWrite(Class> clazz, @Nullable MediaType mediaType);/*** 获取支持的mediaType*/List对于解决这个问题 , canWrite , write方式是不需要处理的 , 只管canRead和read就行 , 在canRead方法中判断了是不是text/html类型 , 是的话就会返回true , Spring就会调用read , 用来将字节流中的数据转换成具体实体 , aClass就是我们最终想要得到的实例对象的Class , StreamUtils这个工具类是SpringBoot自带的一个 , 用来读取InputStream中的数据并返回String字符串 , SpringBoott内部很多地方都用到了这个工具类 , 所以这里来借用一下 , 现在拿到了String型的数据后 , 就需要将String转换成对应的对象 , 这里可能想到了Gson、Fastjson , 使用他们也可以完成 , 但是还需要额外的加入jar包 , SpringBoot自身已经集成了ObjectMapper , 所以在来借用一下 。
package com.hxl.vote.config;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.http.HttpInputMessage;import org.springframework.http.HttpOutputMessage;import org.springframework.http.MediaType;import org.springframework.http.converter.HttpMessageConverter;import org.springframework.http.converter.HttpMessageNotReadableException;import org.springframework.http.converter.HttpMessageNotWritableException;import org.springframework.util.StreamUtils;import java.io.IOException;import java.nio.charset.Charset;import java.util.Arrays;import java.util.List;public class QQHttpMessageConverter implements HttpMessageConverter最后需要要进行配置 , getMessageConverters()会返回现有的HttpMessageConverter集合 , 我们在这个基础上加入我们自定义的HttpMessageConverter即可 , 这回就不报错了 。
@Beanpublic RestTemplate restTemplate(){RestTemplate restTemplate = new RestTemplate();restTemplate.getMessageConverters().add(new QQHttpMessageConverter());returnrestTemplate;}复制代码继承AbstractHttpMessageConverterAbstractHttpMessageConverter帮我们封装了一部分事情 , 但是有些事情是他不能确定的 , 所以要交给子类实现 , 使用以下方法 , 同样可以解决text/html的问题 。
public class QQHttpMessageConverter extends AbstractHttpMessageConverter
- 面临|“熟悉的陌生人”不该被边缘化
- 俄罗斯手机市场|被三星、小米击败,华为手机在俄罗斯排名跌至第三!
- 先别|用了周冬雨的照片,我会成为下一个被告?自媒体创作者先别自乱阵脚
- 美国|印度宣布彻底突破5G难关,美英加澳一片欢呼,一周后白宫怒斥被骗
- 责令|1336款APP被责令整改,三大问题突出
- iPhone|接近8千万!苹果被罚款了!中国iPhone用户这次真的该生气了!
- 误导|苹果又吃巨额罚单,因iPhone防水宣传有误导被重罚9400万
- 覆盖|iPhone13Pro概念机:机身正面被屏幕全覆盖,库克想搞事情?
- 敢动|女生最害怕被“偷看”的3软件,QQ不算啥,第二敢动就“翻脸”
- 涉嫌|李佳琦店铺被罚是怎么回事?店内洗发水涉嫌虚假宣传
