最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot自定義HttpMessageConverter操作

 更新時(shí)間:2021年08月18日 10:24:14   作者:躺在家里不干活  
這篇文章主要介紹了SpringBoot自定義HttpMessageConverter的操作,具有很好的參考價(jià)值,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

簡(jiǎn)介

我們使用**@RequestBody可以將請(qǐng)求體中的JSON字符串綁定到相應(yīng)的bean,使用@ResponseBody**可以使返回結(jié)果不會(huì)被解析為跳轉(zhuǎn)路徑,而是直接寫入 HTTP response body 中,而整個(gè)數(shù)據(jù)綁定的過程其實(shí)是HttpMessageConverter在起作用。

MediaType

MediaType,即是Internet Media Type,互聯(lián)網(wǎng)媒體類型;也叫做MIME類型,在Http協(xié)議消息頭中,使用Content-Type來表示具體請(qǐng)求中的媒體類型信息。

@RequestBody的簡(jiǎn)單實(shí)用

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

1、解析json

Content-Type: application/json

請(qǐng)求數(shù)據(jù)格式

{
 "question": "aaa",
 "fromUser": "bbb"
}

2、解析xml

Content-Type: application/xml

請(qǐng)求數(shù)據(jù)格式

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

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

3、原理

Spring會(huì)根據(jù)MediaType查找合適的HttpMessageConverter的實(shí)現(xiàn)類進(jìn)行序列化的操作

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 把數(shù)據(jù)寫到response的body中

@ResponseBody

ResponseBody中的使用和RequestBody類似

自定義HttpMessageConverter

1、目的

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

2、步驟

編寫Converter類,需要實(shí)現(xiàn)HttpMessageConverter,或者繼承已經(jīng)存在的實(shí)現(xiàn)類,并重寫上文中的關(guān)鍵方法

編寫WebConfig(extends WebMvcConfigurerAdapter)

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

到此為止,我們自定義的Converter已經(jīng)生效了

3、自定義MediaType

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

在自定義的Converter中新增自定義的MediaType,并且根據(jù)需要修改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是根據(jù)這個(gè)方法的返回,以及Controller—@RequestMapping中指定的MediaType,判斷是否可用于當(dāng)前請(qǐng)求/返回。

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

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

consumes是指定請(qǐng)求的MediaType,需要調(diào)用方設(shè)置成我們提供的application/custom-media

produces是指定返回的MediaType,如果我們?cè)O(shè)置成application/custom-media,那么方法返回的數(shù)據(jù)就會(huì)通過自定義的XxxConverter進(jìn)行轉(zhuǎn)換。

問題

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

解決辦法:

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,要不然請(qǐng)求方會(huì)無法解析
        ((ServletServerHttpResponse) outputMessage)
        .getServletResponse().setHeader("Content-Type",APPLICATION_JSON_UTF8_VALUE);
    }
}

總結(jié)

一般情況下,SpringBoot提供的默認(rèn)轉(zhuǎn)換器已經(jīng)足夠我們使用,但是在一些接口的參數(shù)需要加解密,調(diào)整返回體的結(jié)構(gòu)等情況下會(huì)用到。以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java yield()線程讓步實(shí)現(xiàn)過程解析

    Java yield()線程讓步實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Java yield()線程讓步實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 從基礎(chǔ)學(xué)java--數(shù)組

    從基礎(chǔ)學(xué)java--數(shù)組

    數(shù)組是相同類型數(shù)據(jù)的有序集合數(shù)組描述的是相同類型的若干個(gè)數(shù)據(jù),按照一定的先后次序排列組合而成。其中,每一個(gè)數(shù)據(jù)稱作一個(gè)數(shù)組元素,每個(gè)數(shù)組元素可以通過一個(gè)下標(biāo)來訪問它們數(shù)組的聲明創(chuàng)建
    2021-09-09
  • Spring?Lifecycle?和?SmartLifecycle區(qū)別面試精講

    Spring?Lifecycle?和?SmartLifecycle區(qū)別面試精講

    這篇文章主要為大家介紹了Spring?Lifecycle和SmartLifecycle的區(qū)別面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Spring?Web?MVC基礎(chǔ)理論概念

    Spring?Web?MVC基礎(chǔ)理論概念

    Spring?Web?MVC是基于Servlet?API構(gòu)建的原始Web框架,從?開始就包在Spring框架中,Spring?Web?MVC是一個(gè)Web框,本文給大家介紹Spring?Web?MVC基礎(chǔ)理論,感興趣的朋友一起看看吧
    2024-08-08
  • java數(shù)據(jù)結(jié)構(gòu)與算法之希爾排序詳解

    java數(shù)據(jù)結(jié)構(gòu)與算法之希爾排序詳解

    這篇文章主要介紹了java數(shù)據(jù)結(jié)構(gòu)與算法之希爾排序,結(jié)合實(shí)例形式分析了希爾排序的概念、原理、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-05-05
  • 如何獲取springboot打成jar后的classpath

    如何獲取springboot打成jar后的classpath

    這篇文章主要介紹了如何獲取springboot打成jar后的classpath問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • sentinel整合ribbon與fallback流程分步講解

    sentinel整合ribbon與fallback流程分步講解

    這篇文章主要介紹了sentinel整合ribbon與fallback分步流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 淺談java中文本框和文本區(qū)

    淺談java中文本框和文本區(qū)

    本文給大家介紹的是java中的文本框和文本區(qū)的概念和使用方法,以及簡(jiǎn)單的示例,十分實(shí)用,有需要的小伙伴可以參考下。
    2015-06-06
  • 如何解決Java程序包不存在問題

    如何解決Java程序包不存在問題

    在使用IDEA 2022版本和Maven項(xiàng)目中,可能遇到Java程序包不存在的問題,這是由于IDEA的小bug引起的,文章提供了兩種解決方法:第一種是在IDEA的Settings中配置,并在pom.xml中添加特定代碼刷新Maven;第二種是通過IDEA的設(shè)置菜單修改Maven導(dǎo)入配置
    2024-10-10
  • java位運(yùn)算加密示例

    java位運(yùn)算加密示例

    通過位運(yùn)算中的"^"異或運(yùn)算符把字符串與一個(gè)指定的值進(jìn)行異或運(yùn)算,從而改變字符串每個(gè)字符的值,這樣就可以得到一個(gè)加密后的字符串
    2014-02-02

最新評(píng)論

正定县| 石屏县| 乐都县| 龙川县| 周宁县| 庆云县| 观塘区| 林周县| 鸡泽县| 积石山| 民权县| 万年县| 奉新县| 德保县| 剑河县| 英山县| 民权县| 镇江市| 台中县| 手游| 舟曲县| 老河口市| 威海市| 辽中县| 赫章县| 福安市| 塘沽区| 弥勒县| 苏州市| 琼结县| 永嘉县| 吴堡县| 新余市| 思茅市| 香河县| 大埔县| 开江县| 巧家县| 南投县| 公主岭市| 遂宁市|