国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

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
相關文章:
主站蜘蛛池模板: 成人一级视频 | 性欧美高清久久久久久久 | 欧美日韩精品一区二区三区视频播放 | 国产欧美精品一区二区三区四区 | 在线aaa | 国产精品久久久久久免费播放 | 性欧美另类老妇高清 | 国产精品福利社 | 伊人情人综合网 | 久久久久久国产精品免费 | 免费韩国美女爽快一级毛片 | 伊人久热这里只有精品视频99 | 九九干| 真实国产精品视频国产网 | 日韩一区二区三区视频 | 国产精品自拍一区 | 国产99久久久久久免费看 | 波多野结衣在线视频观看 | 久久国产精品最新一区 | 性盈盈影院影院 | 黄色日韩网站 | 美国一级毛片∞ | 久久久www成人免费精品 | 2022麻豆福利午夜久久 | 成人做爰毛片免费视频 | 国产手机在线国内精品 | 97视频免费观看2区 97视频免费上传播放 | 俄罗斯美女毛片 | 综合在线亚洲 | 高清不卡毛片 | 香港全黄一级毛片在线播放 | 在线观看国产精品一区 | 中文字幕波多野不卡一区 | 五月六月伊人狠狠丁香网 | 2021国产精品系列一区二区 | 欧美成人性生活视频 | 国产亚洲精品精品国产亚洲综合 | 岛国大片在线播放高清 | 特级深夜a级毛片免费观看 特级生活片 | 亚洲欧美日韩在线一区二区三区 | 天天干夜夜玩 |