电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

SpringBoot自定義HttpMessageConverter操作

瀏覽:18日期:2023-12-13 10:28:42
目錄簡介MediaType@RequestBody的簡單實用1、解析json2、解析xml3、原理@ResponseBody自定義HttpMessageConverter1、目的2、步驟3、自定義MediaType問題解決辦法:總結簡介

我們使用**@RequestBody可以將請求體中的JSON字符串綁定到相應的bean,使用@ResponseBody**可以使返回結果不會被解析為跳轉路徑,而是直接寫入 HTTP response body 中,而整個數據綁定的過程其實是HttpMessageConverter在起作用。

MediaType

MediaType,即是Internet Media Type,互聯網媒體類型;也叫做MIME類型,在Http協議消息頭中,使用Content-Type來表示具體請求中的媒體類型信息。

@RequestBody的簡單實用

@requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。

1、解析json

Content-Type: application/json

請求數據格式

{ 'question': 'aaa', 'fromUser': 'bbb'}2、解析xml

Content-Type: application/xml

請求數據格式

<?xml version=’1.0’ encoding='utf-8'?> <Request> <question>aaa</question> <fromUser>bbb</fromUser></Request>

上面兩種方式都是可以把數據映射到Bean中的。

3、原理

Spring會根據MediaType查找合適的HttpMessageConverter的實現類進行序列化的操作

public interface HttpMessageConverter<T> { boolean canRead(Class<?> clazz, MediaType mediaType); boolean canWrite(Class<?> clazz, MediaType mediaType); List<MediaType> getSupportedMediaTypes(); T read(Class<? extends T> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException; void write(T t, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException;}方法 作用 getSupportedMediaTypes 獲取支持的MediaType read 讀取request的body write 把數據寫到response的body中 @ResponseBody

ResponseBody中的使用和RequestBody類似

自定義HttpMessageConverter1、目的

SpringBoot提供一系列的HttpMessageConverter,滿足了我們的絕大部分需求,如果有特性需求,我們可以編寫自定義的轉換器

2、步驟

編寫Converter類,需要實現HttpMessageConverter,或者繼承已經存在的實現類,并重寫上文中的關鍵方法

編寫WebConfig(extends WebMvcConfigurerAdapter)

@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter { /** * 自定義message_convert */ @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { // 把converter添加到converters的最后(SpringBoot會使用第一個匹配到的Converter) converters.add(new XxxConverter()); // 把converter添加到converters的最前面 // converters.add(0, new XxxConverter()); }}

到此為止,我們自定義的Converter已經生效了

3、自定義MediaType

雖然我們已經編寫Converter,但是我們一般會為自定義的Converter指定可以處理的媒體類型,可以指定自定義的媒體類型

在自定義的Converter中新增自定義的MediaType,并且根據需要修改canRead,canWrite;

public class XxxConverter implements HttpMessageConverter<Serializable> { public static final String CUSTOM_MEDIA = 'application/custom-media'; @Override public boolean canRead(Class<?> clazz, MediaType mediaType) {return true; } @Override public boolean canWrite(Class<?> clazz, MediaType mediaType) {return true; } @Override public List<MediaType> getSupportedMediaTypes() {return Lists.newArrayList(MediaType.parseMediaType(CUSTOM_MEDIA)); } @Override public Serializable read(Class<? extends Serializable> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {return null; } @Override public void write(Serializable serializable, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException { }}

這里一定要修改getSupportedMediaTypes方法,SpringBoot是根據這個方法的返回,以及Controller—@RequestMapping中指定的MediaType,判斷是否可用于當前請求/返回。

在Controller的@RequestMapping中指定consumes或者produces

@RestController@RequestMapping(produces = CUSTOM_MEDIA, consumes = CUSTOM_MEDIA)@Validatedpublic class HomeController { @GetMapping(HOME) JsonResult info(@RequestHeader('userId') Long userId) {return JsonResult.ok(); }}

consumes是指定請求的MediaType,需要調用方設置成我們提供的application/custom-media

produces是指定返回的MediaType,如果我們設置成application/custom-media,那么方法返回的數據就會通過自定義的XxxConverter進行轉換。

問題

注意:如果我們修改了produces的MediaType,那么HTTP返回中的MediaType也會是我們自定義的類型,除非和調用方約定好,否則調用方是沒有辦法解析的。

解決辦法:

public class XxxConverter implements HttpMessageConverter<Serializable> { ...... @Override public void write(Serializable serializable, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {// 最后把Content-Type改成APPLICATION_JSON_UTF8_VALUE,要不然請求方會無法解析((ServletServerHttpResponse) outputMessage).getServletResponse().setHeader('Content-Type',APPLICATION_JSON_UTF8_VALUE); }}總結

一般情況下,SpringBoot提供的默認轉換器已經足夠我們使用,但是在一些接口的參數需要加解密,調整返回體的結構等情況下會用到。以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 磁力加热搅拌器-多工位|大功率|数显恒温磁力搅拌器-司乐仪器官网 | 服务器之家 - 专注于服务器技术及软件下载分享 | 金环宇|金环宇电线|金环宇电缆|金环宇电线电缆|深圳市金环宇电线电缆有限公司|金环宇电缆集团 | 企小优-企业数字化转型服务商_网络推广_网络推广公司 | 动库网动库商城-体育用品专卖店:羽毛球,乒乓球拍,网球,户外装备,运动鞋,运动包,运动服饰专卖店-正品运动品网上商城动库商城网 - 动库商城 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 杭州成人高考_浙江省成人高考网上报名 | 气动隔膜泵-电动隔膜泵-循环热水泵-液下排污/螺杆/管道/化工泵「厂家」浙江绿邦 | 北京中创汇安科贸有限公司 | 代理记账_公司起名核名_公司注册_工商注册-睿婕实业有限公司 | 冷却塔改造厂家_不锈钢冷却塔_玻璃钢冷却塔改造维修-广东特菱节能空调设备有限公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 数年网路-免费在线工具您的在线工具箱-shuyear.com | 运动木地板厂家_体育木地板安装_篮球木地板选购_实木运动地板价格 | 郑州巴特熔体泵有限公司专业的熔体泵,熔体齿轮泵与换网器生产厂家 | 一体化预制泵站-一体化提升泵站-一体化泵站厂家-山东康威环保 | 越南专线物流_东莞国际物流_东南亚专线物流_行通物流 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | sfp光模块,高速万兆光模块工厂-性价比更高的光纤模块制造商-武汉恒泰通 | 内窥镜-工业内窥镜厂家【上海修远仪器仪表有限公司】 | 苏州工作服定做-工作服定制-工作服厂家网站-尺品服饰科技(苏州)有限公司 | 涂层测厚仪_漆膜仪_光学透过率仪_十大创新厂家-果欧电子科技公司 | 100国际学校招生 - 专业国际学校择校升学规划 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | 头条搜索极速版下载安装免费新版,头条搜索极速版邀请码怎么填写? - 欧远全 | 依维柯自动挡房车,自行式国产改装房车,小型房车价格,中国十大房车品牌_南京拓锐斯特房车 - 南京拓锐斯特房车 | Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 | 开云(中国)Kaiyun·官方网站-登录入口 | 厂厂乐-汇聚海量采购信息的B2B微营销平台-厂厂乐官网 | 太阳能发电系统-太阳能逆变器,控制器-河北沐天太阳能科技首页 | 美国PARKER齿轮泵,美国PARKER柱塞泵,美国PARKER叶片泵,美国PARKER电磁阀,美国PARKER比例阀-上海维特锐实业发展有限公司二部 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 佛山市德信昌电子有限公司|