精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

帶你玩轉(zhuǎn)SpringMVC自定義HTTP請求響應(yīng)數(shù)據(jù)轉(zhuǎn)換

開發(fā) 前端
自定義HttpMessageConverter是Spring MVC中一個強(qiáng)大的工具,它可以幫助開發(fā)者更加靈活地控制數(shù)據(jù)轉(zhuǎn)換的過程,滿足特定的需求。

環(huán)境:SpringBoot2.7.12

1. 簡介

在Spring MVC中,HttpMessageConverter主要用于將HTTP請求的輸入內(nèi)容轉(zhuǎn)換為指定的Java對象,以及將Java對象轉(zhuǎn)換為HTTP響應(yīng)的輸出內(nèi)容。這種靈活的消息轉(zhuǎn)換機(jī)制就是利用HttpMessageConverter來實現(xiàn)的。

Spring MVC提供了多個默認(rèn)的HttpMessageConverter實現(xiàn),包括處理JSON、XML、文本等格式的Converter。另外,我們也可以自定義HttpMessageConverter來處理其他格式的數(shù)據(jù)。

Spring MVC提供了兩個注解:@RequestBody和@ResponseBody,分別用于完成請求報文到對象和對象到響應(yīng)報文的轉(zhuǎn)換。

然而,有時候默認(rèn)的HttpMessageConverter無法滿足特定的需求,例如,當(dāng)我們需要處理的數(shù)據(jù)格式?jīng)]有默認(rèn)的Converter時,或者我們需要對現(xiàn)有的Converter進(jìn)行擴(kuò)展時,就需要自定義HttpMessageConverter。

自定義HttpMessageConverter可以讓我們更加靈活地控制數(shù)據(jù)轉(zhuǎn)換的過程,例如我們可以自定義轉(zhuǎn)換規(guī)則、異常處理等。

接下來我們通過一個實例講解如何自定義HttpMessageConverter。

需求

接口請求數(shù)據(jù)格式:

xxx|yyy|zzz|...

接口返回JSON數(shù)據(jù)格式

{
    "xxx": xxx,
    "yyy": yyy,
    "zzz": zzz,
    ...
}

其實就上面的數(shù)據(jù)格式,我們完全可以不用自定義HttpMessageConverter也是完全可以實現(xiàn)的。我們這里主要就是教大家如何在特殊的需求下實現(xiàn)特定的數(shù)據(jù)轉(zhuǎn)換處理。

2. 實戰(zhàn)案例

自定義HttpMessageConverter轉(zhuǎn)換器

public class PackHttpMessageConverter implements HttpMessageConverter<Object> {
    
  // 設(shè)置自定義的Content-Type類型,這樣就限定了只有請求的內(nèi)容類型是該類型才會使用該轉(zhuǎn)換器進(jìn)行處理
  private static final MediaType PACK = new MediaType("application", "pack", StandardCharsets.UTF_8) ;


  // 判斷當(dāng)前轉(zhuǎn)換器是否能夠讀取數(shù)據(jù)
  @Override
  public boolean canRead(Class<?> clazz, MediaType mediaType) {
    return PACK.equals(mediaType) ;
  }
  // 判斷當(dāng)前轉(zhuǎn)換器是否可以將結(jié)果數(shù)據(jù)進(jìn)行輸出到客戶端
  @Override
  public boolean canWrite(Class<?> clazz, MediaType mediaType) {
    return true ;
  }
  // 返回當(dāng)前轉(zhuǎn)換器只支持application/pack類型的數(shù)據(jù)格式
  @Override
  public List<MediaType> getSupportedMediaTypes() {
    return Arrays.asList(PACK) ;
  }


  // 從請求中讀取數(shù)據(jù)
  @Override
  public Object read(Class<? extends Object> clazz, HttpInputMessage inputMessage)
      throws IOException, HttpMessageNotReadableException {
    InputStream is = inputMessage.getBody() ;
    String res = IOUtils.toString(is, StandardCharsets.UTF_8) ;
    // 這里簡單處理只針對Users類型的對象處理
    if (clazz == Users.class) {
      try {
        // 創(chuàng)建實例
        Users target = (Users) clazz.newInstance() ;
        String[] s = res.split("\\|");
        target.setId(Long.valueOf(s[0])) ;
        target.setName(s[1]) ;
        target.setAge(Integer.valueOf(s[2])) ;
        target.setIdNo(s[3]) ;
        return target ;
      } catch (InstantiationException | IllegalAccessException e) {
        e.printStackTrace() ;
      }
    }
    return null ;
  }


  // 將Controller方法返回值寫到客戶端
  @Override
  public void write(Object t, MediaType contentType, HttpOutputMessage outputMessage)
      throws IOException, HttpMessageNotWritableException {
    // 設(shè)置響應(yīng)頭為json格式
    outputMessage.getHeaders().add("Content-Type", "application/json;charset=UTF-8") ;
    ObjectMapper mapper = new ObjectMapper() ;
    OutputStream os = outputMessage.getBody();
    // 輸出結(jié)果內(nèi)容
    os.write(mapper.writeValueAsString(t).getBytes(StandardCharsets.UTF_8)) ;
    os.flush(); 
  }
  
}


將PackHttpMessageConverter注冊到容器中

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
  
  @Override
  public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new PackHttpMessageConverter()) ;
  }
}

到這里自定義HttpMessageConverter及注冊到容器中就全部完成了,開發(fā)還是比較簡單,接下來做測試

接口

// 方法非常簡單還是用的那些常用的類,@RequestBody接收請求body中的內(nèi)容
@PostMapping("/i")
public Object i(@RequestBody Users user) {
  System.out.println(handlerAdapter) ;
  return user ;
}

通過Postman測試接口

設(shè)置請求的header

圖片圖片

圖片圖片

似乎沒有任何的問題,其實你只要在寫的方法中打印下日志,或者調(diào)試下,你會發(fā)現(xiàn)你的write方法根本就沒有被調(diào)用,也就是說寫數(shù)據(jù)并沒有使用到我們自定義的實現(xiàn),這是因為有優(yōu)先級比我們自定義的轉(zhuǎn)換器高,所以要想讓寫消息也調(diào)用自定義的。我們需要如下修改注冊方式:

public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
  converters.add(0, new PackHttpMessageConverter()) ;
}

這樣我們自定義的轉(zhuǎn)換器就排到了第一的位置,這樣就會調(diào)用我們自定義的write方法。

以上就是自定義HttpMessageConverter全部內(nèi)容。

3. 實現(xiàn)原理

請求參數(shù)由于添加了@RequestBody,所以方法的參數(shù)解析器使用的是RequestResponseBodyMethodProcessor。

public class RequestResponseBodyMethodProcessor extends AbstractMessageConverterMethodProcessor {
  protected <T> Object readWithMessageConverters(NativeWebRequest webRequest, MethodParameter parameter,
      Type paramType) throws IOException, HttpMediaTypeNotSupportedException, HttpMessageNotReadableException {
    // ...
    // 讀取請求數(shù)據(jù);調(diào)用父類方法
    Object arg = readWithMessageConverters(inputMessage, parameter, paramType);
    // ...
  }
}

AbstractMessageConverterMethodArgumentResolver

public abstract class AbstractMessageConverterMethodArgumentResolver {
  protected <T> Object readWithMessageConverters(...) {
    // ...
    // 遍歷所有的消息轉(zhuǎn)換器
    for (HttpMessageConverter<?> converter : this.messageConverters) {
        Class<HttpMessageConverter<?>> converterType = (Class<HttpMessageConverter<?>>) converter.getClass();
        GenericHttpMessageConverter<?> genericConverter = (converter instanceof GenericHttpMessageConverter ? (GenericHttpMessageConverter<?>) converter : null);
        // 判斷當(dāng)前轉(zhuǎn)換器是否讀,也就上面我們自定義中實現(xiàn)的canRead方法
        if (genericConverter != null ? genericConverter.canRead(targetType, contextClass, contentType) :
            (targetClass != null && converter.canRead(targetClass, contentType))) {
          if (message.hasBody()) {
            HttpInputMessage msgToUse = getAdvice().beforeBodyRead(message, parameter, targetType, converterType);
            // 讀取具體的數(shù)據(jù)內(nèi)容
            body = (genericConverter != null ? genericConverter.read(targetType, contextClass, msgToUse) : ((HttpMessageConverter<T>) converter).read(targetClass, msgToUse));
            body = getAdvice().afterBodyRead(body, msgToUse, parameter, targetType, converterType);
          }
          else {
            body = getAdvice().handleEmptyBody(null, message, parameter, targetType, converterType);
          }
          break;
        }
      }
  }
}

原理也比較的簡單。

自定義HttpMessageConverter是Spring MVC中一個強(qiáng)大的工具,它可以幫助開發(fā)者更加靈活地控制數(shù)據(jù)轉(zhuǎn)換的過程,滿足特定的需求。

責(zé)任編輯:武曉燕 來源: Spring全家桶實戰(zhàn)案例源碼
相關(guān)推薦

2023-12-04 07:27:54

SpringMVC方法

2022-12-07 08:56:27

SpringMVC核心組件

2022-06-20 08:26:39

Spring容器類型轉(zhuǎn)換

2022-11-01 11:15:56

接口策略模式

2021-07-11 17:17:08

.NET 授權(quán)自定義

2021-08-09 10:31:33

自定義授權(quán)響應(yīng)

2019-01-27 14:37:47

數(shù)據(jù)HTTP服務(wù)

2009-08-12 14:53:50

C#類型轉(zhuǎn)換函數(shù)

2015-02-12 15:33:43

微信SDK

2023-10-06 10:47:25

Mybatis類型轉(zhuǎn)換

2011-07-04 14:08:02

C++

2015-02-12 15:38:26

微信SDK

2024-01-05 15:28:06

鴻蒙數(shù)據(jù)同步GlobalThis

2009-08-28 17:45:19

C#自定義數(shù)據(jù)

2016-12-26 15:25:59

Android自定義View

2016-11-16 21:55:55

源碼分析自定義view androi

2023-06-06 08:01:18

自定義接口響應(yīng)

2011-06-23 10:49:13

Qt 自定義信號

2025-05-12 08:00:55

2021-08-13 08:36:15

SpringMVC自定義
點贊
收藏

51CTO技術(shù)棧公眾號

亚洲成年人影院| 免费不卡在线视频| 亚洲国产精品成人精品| 男人揉女人奶房视频60分| 色av男人的天堂免费在线| 久久久久国内| 欧美人与性动交| xxxxx在线观看| 日韩欧美高清一区二区三区| 五月综合激情网| 午夜久久资源| www.xxx国产| 老牛嫩草一区二区三区日本| 中日韩美女免费视频网址在线观看 | 少妇精品久久久| 欧美另类久久久品| 香港三级日本三级a视频| 青青草手机在线| 国产精品一区二区久久不卡 | 国产毛片aaa| 午夜影院欧美| 亚洲欧美中文字幕| 一级黄色大片免费看| 日本在线中文字幕一区二区三区| 一区二区三区 在线观看视频| 欧美成人蜜桃| 黄色av一区二区三区| 欧美a级一区二区| 97久久国产精品| 一区二区成人免费视频| 精品视频日韩| 日韩av在线网页| aaa黄色大片| 白嫩亚洲一区二区三区| 在线亚洲人成电影网站色www| 国产中文字幕乱人伦在线观看| 日本中文字幕视频在线| 久久九九久精品国产免费直播| 成人综合电影| 精品人妻午夜一区二区三区四区| 另类综合日韩欧美亚洲| 国产成人综合亚洲| 国产小视频在线免费观看 | 人妻少妇被粗大爽9797pw| 精品一性一色一乱农村| 亚洲精品视频在线观看网站| 亚洲欧美久久久久一区二区三区| 欧美女子与性| 久久综合精品国产一区二区三区 | 欧美最猛性xxxx| 日本五十熟hd丰满| 亚洲区第一页| 91国产精品电影| 日本三级2019| 亚洲久久一区二区| 97精品国产aⅴ7777| 天天操天天干视频| 国产日韩综合| 欧美亚洲国产精品| 奇米影视第四色777| 9色精品在线| 日本欧美精品在线| 日韩在线播放中文字幕| 久久不射网站| 国产精品美女久久久久久免费| 国产高潮久久久| 久久高清免费观看| 国产精品精品国产| 中文字幕欧美人妻精品一区蜜臀| 免费观看成人av| 成人黄在线观看| a网站在线观看| 岛国av在线一区| 九色综合婷婷综合| 国产一级免费在线观看| 国产精品久久久久久久久免费桃花| 亚洲精品成人久久久998| 婷婷激情在线| 亚洲一区在线观看免费观看电影高清| 国产 日韩 欧美在线| 在线能看的av网址| 在线观看91视频| 91 在线视频观看| 日韩中文一区二区| 日韩精品欧美国产精品忘忧草| 麻豆av免费观看| 999久久久91| 欧美极品第一页| 欧产日产国产69| 久久99久久久久| 国产精品毛片一区视频| 可以直接在线观看的av| 亚洲欧洲三级电影| 国产精品999视频| 日韩精品一区二区三区av| 日韩一区二区免费在线电影| 人妻av一区二区| 成人影院在线| 久久免费视频观看| 国产精品xxxxxx| 成人一级视频在线观看| 亚洲国产精品毛片| a√中文在线观看| 欧美三级一区二区| 成人午夜精品无码区| 清纯唯美亚洲综合一区| 久久露脸国产精品| 国产精品一区二区三区在线免费观看| av亚洲精华国产精华精| 一本色道婷婷久久欧美| 香蕉伊大人中文在线观看| 欧美日韩dvd在线观看| v天堂中文在线| 亚洲深深色噜噜狠狠爱网站| 日韩av手机在线| 亚洲精品中文字幕成人片| 国产精品三级电影| 久久精品免费看| 成人网在线视频| 青草久久伊人| 亚洲r级在线视频| 一级黄色大片儿| 精品国精品国产自在久国产应用| 色综合久久中文字幕综合网小说| 波多野结衣mp4| 99精品欧美一区二区蜜桃免费| 懂色av一区二区三区四区五区| 在线观看欧美日韩电影| 精品国产一区二区三区不卡 | 三上悠亚在线一区| 九九综合久久| 97国产精品视频| 成人激情四射网| 日韩毛片视频在线看| 天天爽人人爽夜夜爽| 少妇精品导航| 98精品在线视频| 欧美 日韩 国产 在线| 亚洲精品视频在线看| 天堂在线中文在线| 久久精品国产68国产精品亚洲| 国产91在线播放九色快色| 人妻少妇精品无码专区久久| 一区二区三区鲁丝不卡| 深爱五月综合网| 性欧美欧美巨大69| 成人欧美一区二区三区黑人孕妇| eeuss影院www在线观看| 欧美中文字幕一区二区三区亚洲| 四虎永久免费影院| 国产精品视频| 欧美成熟毛茸茸复古| 中文字幕在线直播| 亚洲精品在线观看www| 国产又色又爽又黄的| av一本久道久久综合久久鬼色| 国产69精品久久久久久久| 国产精品久av福利在线观看| 欧美精品久久久久久久久久| 可以免费观看的毛片| 亚洲国产视频一区| 国产黑丝一区二区| 国产精品老牛| 日韩精品一区二区三区色偷偷| 国产成人精品123区免费视频| 中文字幕精品网| 91 中文字幕| 亚洲美女屁股眼交| 国产一线在线观看| 欧美资源在线| 永久免费精品视频网站| 麻豆一区在线| 韩国日本不卡在线| 国产精品免费观看| 欧美美女黄视频| 麻豆亚洲av熟女国产一区二| kk眼镜猥琐国模调教系列一区二区| 国产精品999视频| 日韩精品久久| 97se亚洲综合在线| 九色porny丨首页入口在线| 亚洲日本中文字幕免费在线不卡| 在线免费a视频| 亚洲自拍偷拍av| 一本色道综合久久欧美日韩精品| 日本最新不卡在线| 国产欧美自拍视频| 久久影视三级福利片| 国产精品久久久亚洲| av理论在线观看| 日韩国产激情在线| 国产欧美综合视频| 欧美日韩国产一区中文午夜| 亚洲aaa视频| 成人av网站在线观看| 牛夜精品久久久久久久| 亚洲黄色影院| 亚洲最大免费| 日韩aaa久久蜜桃av| 国产精品久久久久久久久免费看| 天天干在线视频论坛| 亚洲色图综合久久| 成人h动漫精品一区二区无码| 欧美日韩亚洲一区二区三区| 成人自拍小视频| 久久久综合视频| 精品人妻一区二区乱码| 奇米亚洲午夜久久精品| 日韩视频免费播放| 亚洲乱码在线| 日本在线观看一区二区三区| 成人线上播放| 91网在线免费观看| 欧美va在线观看| 高清一区二区三区日本久| 麻豆tv在线| 一区二区三区天堂av| 人妻少妇精品无码专区| 日韩一区二区三区电影在线观看| 亚洲精品国产精品国自产网站按摩| 亚洲午夜精品一区二区三区他趣| 影音先锋男人看片资源| 91麻豆精品视频| 年下总裁被打光屁股sp| 国产综合一区二区| 黄色免费网址大全| 亚洲综合日韩| 日韩精品 欧美| 欧美人成在线| 欧美日韩在线免费观看视频| 国产最新精品| 欧美日韩综合网| 性人久久久久| 久久精品二区| 精品自拍偷拍| 国产视频精品网| 9999久久久久| 91日韩久久| 国产一区精品二区| 成人久久精品视频| 国产精品成人**免费视频| 国产精品久久久久久久久久ktv| 91久久国产综合久久91猫猫| 欧美亚洲一级片| 看黄在线观看| 2019中文字幕在线| 小早川怜子影音先锋在线观看| 97精品在线视频| 极品av在线| 欧美中文字幕在线播放| 水蜜桃在线视频| 奇米影视亚洲狠狠色| 蜜臀国产一区| 国产99久久精品一区二区 夜夜躁日日躁| 绿色成人影院| 欧洲成人免费aa| 三级成人在线| 国产日韩精品在线| 亚洲电影二区| 99久久99久久| 国产精品对白| 欧美一区二区三区四区五区六区| 国产99精品一区| 视频一区不卡| 亚洲xxx拳头交| 性高湖久久久久久久久aaaaa| 在线观看的日韩av| 玩弄中年熟妇正在播放| 久久青草久久| xxww在线观看| 国产精品自拍网站| 99热超碰在线| 久久久不卡网国产精品二区| 欧美福利第一页| 亚洲欧美日韩久久精品| 精品一区在线视频| 一本色道久久综合亚洲91 | 日韩欧美在线观看一区二区三区| 成人毛片视频免费看| 亚洲欧美国产一区二区三区| 91在线看黄| 久久久久久久久久久91| 毛片免费看不卡网站| 91久久在线视频| 丝袜美腿一区二区三区动态图| 亚洲 国产 日韩 综合一区| 在线看片不卡| 妞干网在线免费视频| 国产一区在线观看麻豆| 久久久久麻豆v国产精华液好用吗| 国产日韩欧美精品综合| 国产亚洲第一页| 欧美伊人久久大香线蕉综合69| 成人h动漫精品一区二区无码| 亚洲视频在线观看| 青青在线视频| 国产精品私拍pans大尺度在线| 综合激情久久| 亚洲巨乳在线观看| av不卡在线看| 婷婷中文字幕在线观看| 久久久久久亚洲综合| 国产97免费视频| 色婷婷久久综合| 成人午夜视频一区二区播放| 在线成人免费网站| caoporn视频在线| 亚洲自拍偷拍在线| 教室别恋欧美无删减版| 国产高清av在线播放| 韩国欧美国产1区| 最近中文字幕免费| 大伊人狠狠躁夜夜躁av一区| japanese国产| 久久香蕉国产线看观看网| 日本在线影院| 91入口在线观看| 欧美熟乱15p| 亚洲 自拍 另类小说综合图区| 看电视剧不卡顿的网站| 亚洲色图14p| 久久麻豆一区二区| 国产午夜精品无码一区二区| 欧美一二三四区在线| 欧美亚洲日本| 欧美大片在线看| 欧美一级做a| 欧美精品成人一区二区在线观看| 亚洲高清电影| 人妻少妇偷人精品久久久任期| 国产精品久久久久久久蜜臀| www.com国产| 欧美mv日韩mv亚洲| 老司机午夜在线视频| 国模精品视频一区二区三区| 99国内精品久久久久| 欧美日韩在线精品一区二区三区| 久久国产福利| 人妻无码中文久久久久专区| 亚洲国产精品嫩草影院| 国产美女永久免费| 中文字幕在线成人| 日韩一区二区三免费高清在线观看| 蜜桃视频在线观看成人| 亚洲影音先锋| 性久久久久久久久久久| 亚洲欧美另类久久久精品2019| ,亚洲人成毛片在线播放| 一区二区欧美久久| 欧美大片1688网站| 日本不卡二区| 一本色道精品久久一区二区三区 | 久久久国产影院| 亚瑟国产精品| japanese在线视频| 国产综合久久久久久鬼色| 欧美成人精品欧美一| 欧美一二三区精品| 成人女同在线观看| 国产亚洲一区二区三区在线播放| 欧美88av| 国产精品手机在线观看| 婷婷久久综合九色国产成人| 蜜桃免费在线| 国产精品mp4| 亚洲h色精品| 男人女人拔萝卜视频| 亚洲欧美国产毛片在线| 黄色一级大片在线免费看国产| 性欧美xxxx交| 国内成人自拍| 欧美成人福利在线观看| 又紧又大又爽精品一区二区| www.五月天激情| 久久久久久久久国产| 精品一区毛片| 天天干天天草天天| 一区二区三区不卡视频| 少妇无码一区二区三区| 国产91色在线|免| 婷婷精品进入| 性色av浪潮av| 五月天婷婷综合| 国产二区在线播放| 亚洲一区二区三区sesese| 亚洲午夜精品久久久久久app| 亚洲精品成人无码熟妇在线| 精品视频123区在线观看| 久草在线视频网站| 欧美日韩三区四区| 国产女优一区| 欧美爱爱免费视频| 亚洲福利视频网站| 日本午夜精品久久久久| 97在线免费视频观看| 久久网这里都是精品| 97超碰人人模人人人爽人人爱| 91精品国产91久久久久久不卡| 国产亚洲一区| 亚洲一区精品视频在线观看|