色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

SpringBoot自定義HttpMessageConverter操作

瀏覽:16日期: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
相關文章:
主站蜘蛛池模板: 精品国产精品a | 天天激情站 | 一级毛片免费播放 | 日韩精品一区二区三区视频网 | 午夜a毛片 | 欧洲老妇bbbbbxxxxx | 国产精品久久久久久免费播放 | 亚洲码在线观看 | 欧美aaaaaabbbbb| 国产专区一va亚洲v天堂 | 天天爱天天做天天爽天天躁 | 国产亚洲精品影达达兔 | 97在线观看免费版 | 亚洲天堂久久新 | 色婷婷激婷婷深爱五月老司机 | 日本韩经典三级在线播放 | 韩国在线精品福利视频在线观看 | 看5xxaaa免费毛片 | 中文字幕国产亚洲 | 久久精品国产只有精品2020 | 日韩三级欧美 | 欧美成人a视频 | 国产亚洲高清在线精品不卡 | 亚洲人成免费网站 | 波多野结衣在线播放视频 | 国产精品自在自线亚洲 | 久久成人精品免费播放 | 免费国产成人高清视频网站 | 免费国产成人高清在线观看不卡 | 欧美特黄高清免费观看的 | 日本在线加勒比 | 国产一级片儿 | 国内9l视频自拍 | 2021国内自拍 | 步兵一区二区三区在线观看 | 日本波多野结衣视频 | 国产无套视频在线观看香蕉 | 国产成人精品综合久久久 | 97在线观看完整免费 | 一级一片免费视频播放 | 国产黄色片网站 |