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

SpringBoot自定義MessageConvert詳細(xì)講解

 更新時間:2023年01月11日 15:38:37   作者:zoeil  
正在學(xué)習(xí)SpringBoot,在自定義MessageConverter時發(fā)現(xiàn):為同一個返回值類型配置多個MessageConverter時,可能會發(fā)生響應(yīng)數(shù)據(jù)格式錯誤,或406異常(客戶端無法接收相應(yīng)數(shù)據(jù))。在此記錄一下解決問題以及追蹤源碼的過程

前言

對于頁面攜帶的請求頭中的AcceptSpringBoot有對應(yīng)的10種MessageConvert可以支持寫出對應(yīng)的媒體類型,比如application/xml、application/json……

我們還可以通過向容器放入一個WebMvcConfigurer

實現(xiàn)定制化SpingMVC,自定義一個MessageConvert處理特殊的協(xié)議比如application/x-person

實現(xiàn)多協(xié)議數(shù)據(jù)兼容。json、xml、x-person

原理

0、@ResponseBody 響應(yīng)數(shù)據(jù)出去 調(diào)用 RequestResponseBodyMethodProcessor 處理

1、Processor 處理方法返回值。通過 MessageConverter 處理

2、所有 MessageConverter 合起來可以支持各種媒體類型數(shù)據(jù)的操作(讀、寫)

3、內(nèi)容協(xié)商找到最終的 messageConverter;

實現(xiàn)

/* 條件
 *
 * 1、瀏覽器發(fā)請求直接 返回xml   [application/xml]   jacksonXmlConverter
 * 2、如果是ajax請求 返回json   [application/json]  jacksonJsonConverter
 * 3、如果是app發(fā)請求,返回自定義協(xié)議數(shù)據(jù) [application/x-person]   xxxxConverter
 *
 * 步驟:
 *  1、添加自定義的MessageConverter進(jìn)系統(tǒng)底層
 *  2、系統(tǒng)底層就會統(tǒng)計出所有MessageConverter能操作哪些類型
 *  3、客戶端內(nèi)容協(xié)商 [person--->person]
 */

person類

@Data
public class Person {
    public String username;
    public Integer age;
    public Pet pet;
}

pet類

@Data
public class Pet {
    public String name;
    public Integer age;
}
PersonMessageConvert
/*
 * 自定義的Convert
 */
public class PersonMessageConvert implements HttpMessageConverter<Person> {
    @Override
    public boolean canRead(Class<?> clazz, MediaType mediaType) {
        return false;
    }
    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        return clazz.isAssignableFrom(Person.class);
    }
    /*
     * @Description 服務(wù)器需要統(tǒng)計所有MessageConvert都能寫出哪些類型,我們這里也要自定義
     * @Param
     **/
    @Override
    public List<MediaType> getSupportedMediaTypes() {
        return MediaType.parseMediaTypes("application/x-person");
    }
    @Override
    public Person read(Class<? extends Person> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {
        return null;
    }
    @Override
    public void write(Person person, MediaType contentType, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {
        //自定義協(xié)會數(shù)據(jù)的寫出
        String data = person.getUsername() + ";" + person.getAge() + ";" +person.getPet() + ";";
        //寫出去
        OutputStream body = outputMessage.getBody();
        body.write(data.getBytes());
    }
}

方法

    @ResponseBody
    @GetMapping("/test/person")
    public Person getPeroson() {
        Person person = new Person();
        person.setUsername("張三");
        person.setAge(18);
        person.setPet(new Pet());
        return person;
    }

WebMvcConfigurer

    @Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            @Override
            public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                converters.add(new PersonMessageConvert());
            }
       }
    }

測試

拓展

如何實現(xiàn)訪問路徑攜帶format參數(shù)指明協(xié)商協(xié)議

比如:http://localhost:8080/test/person?format=x-person

記得先開啟基于參數(shù)的內(nèi)容協(xié)商

spring:
  mvc:
    contentnegotiation:
      favor-parameter: true

@Bean
    public WebMvcConfigurer webMvcConfigurer() {
        return new WebMvcConfigurer() {
            /*
             * 自定義內(nèi)容協(xié)商策略
             */
            @Override
            public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
                Map<String, MediaType> mediaTypeMap = new HashMap<>();
                mediaTypeMap.put("json", MediaType.APPLICATION_JSON);
                mediaTypeMap.put("xml", MediaType.APPLICATION_XML);
                mediaTypeMap.put("x-person",MediaType.parseMediaType("application/x-person"));
                //指定支持解析那些參數(shù)的媒體類型
                ParameterContentNegotiationStrategy parametertrategy = new ParameterContentNegotiationStrategy(mediaTypeMap);
                HeaderContentNegotiationStrategy headerStrategy = new HeaderContentNegotiationStrategy();
                configurer.strategies(Arrays.asList(parametertrategy, headerStrategy));
            }
            @Override
            public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
                converters.add(new PersonMessageConvert());
            }
        };
    }

測試

注意:有可能我們添加的自定義的功能會覆蓋默認(rèn)很多功能,導(dǎo)致一些默認(rèn)的功能失效。比如上面的ContentNegotiationConfigurer 就會覆蓋原來的默認(rèn)ContentNegotiationConfigurer

到此這篇關(guān)于SpringBoot自定義MessageConvert詳細(xì)講解的文章就介紹到這了,更多相關(guān)SpringBoot MessageConvert內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在java中獲取List集合中最大的日期時間操作

    在java中獲取List集合中最大的日期時間操作

    這篇文章主要介紹了在java中獲取List集合中最大的日期時間操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • springBoot 與neo4j的簡單整合示例

    springBoot 與neo4j的簡單整合示例

    這篇文章主要介紹了springBoot 與neo4j的簡單整合示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java對數(shù)組實現(xiàn)選擇排序算法的實例詳解

    Java對數(shù)組實現(xiàn)選擇排序算法的實例詳解

    這篇文章主要介紹了Java對數(shù)組實現(xiàn)選擇排序算法的實例,選擇排序的比較次數(shù)為 O(N^2)而交換數(shù)為O(N),需要的朋友可以參考下
    2016-04-04
  • 關(guān)于springboot打包目錄全解析

    關(guān)于springboot打包目錄全解析

    這篇文章主要介紹了springboot打包目錄解析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • java判斷class子類或父類的實例方法

    java判斷class子類或父類的實例方法

    在本篇文章里小編給大家整理的是關(guān)于java判斷class子類或父類的實例方法,需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • Springboot @Autowired和@Resource的區(qū)別解析

    Springboot @Autowired和@Resource的區(qū)別解析

    @Resource是JDK 提供的注解,只是Spring 在實現(xiàn)上提供了這個注解的功能支持,本文給大家介紹Springboot @Autowired和@Resource的區(qū)別,感興趣的朋友一起看看吧
    2025-04-04
  • SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    SpringBoot中的@ConditionalOnMissingBean注解使用詳解

    這篇文章主要介紹了SpringBoot中的@ConditionalOnMissingBean注解使用詳解,@ConditionalOnMissingBean作用在@Bean定義上,也就是說在容器加載它作用的Bean時,檢查容器中是否存在目標(biāo)類型,需要的朋友可以參考下
    2024-01-01
  • 教你用Java在個人電腦上實現(xiàn)微信掃碼支付

    教你用Java在個人電腦上實現(xiàn)微信掃碼支付

    今天給大家?guī)淼氖荍ava實戰(zhàn)的相關(guān)知識,文章圍繞著Java在個人電腦上實現(xiàn)微信掃碼支付展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java通過百度地圖API獲取定位(普通IP定位)的方法教程

    Java通過百度地圖API獲取定位(普通IP定位)的方法教程

    這篇文章主要介紹了Java通過百度地圖API獲取定位的方法教程,首先說明了實現(xiàn)這個功能的需求和初衷,然后詳細(xì)描述了利用百度地圖API實現(xiàn)這個功能的步驟,包括在百度地圖開放平臺的準(zhǔn)備工作、學(xué)習(xí)官網(wǎng)API文檔、修改API的AK配置、Java代碼獲取定位等,需要的朋友可以參考下
    2024-11-11
  • 帶你快速搞定java IO

    帶你快速搞定java IO

    這篇文章主要介紹了Java IO流 文件傳輸基礎(chǔ)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下,希望能給你帶來幫助
    2021-07-07

最新評論

万源市| 麦盖提县| 吉隆县| 新郑市| 微山县| 五峰| 铜鼓县| 高淳县| 图们市| 区。| 保山市| 长汀县| 舟山市| 新野县| 青田县| 慈利县| 来安县| 阳原县| 白山市| 定南县| 筠连县| 奉化市| 大同县| 阿克| 新兴县| 保德县| 姜堰市| 太原市| 柘荣县| 友谊县| 漯河市| 应城市| 沧源| 任丘市| 香港| 准格尔旗| 什邡市| 灯塔市| 凤山市| 昆明市| 永顺县|