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

feign post參數(shù)對(duì)象不加@RequestBody的使用說(shuō)明

 更新時(shí)間:2021年10月23日 09:03:11   作者:miaokezhang  
這篇文章主要介紹了feign post參數(shù)對(duì)象不加@RequestBody的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

feign post參數(shù)對(duì)象不加@RequestBody

最近在做小程序調(diào)支付服務(wù)接口的一個(gè)功能,這個(gè)feign接口傳參真的太費(fèi)事。

代碼我就改造了下,不直接上真實(shí)代碼。

比如小程序調(diào)支付服務(wù)的訂單查詢接口,支付服務(wù)那邊的controller的訂單查詢方法是:

 @ResponseBody
    @RequestMapping(value = "/order/select", method = RequestMethod.POST)
    @ApiOperation(value = "訂單查詢", notes = "訂單查詢")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "queryNum", value = "查詢流水", paramType = "form", required = true),
            @ApiImplicitParam(name = "queryDate", value = "流水日期", paramType = "form", required = false)
    })
    public Order qryBarcodePay(@ApiIgnore Order hero) throws Exception {
        xxxxx;
    }

這個(gè)post接口,有點(diǎn)奇怪,多了很多沒(méi)見(jiàn)過(guò)的注解,而一般情況,post接口里參數(shù)對(duì)象應(yīng)該是這么寫的:

....
public Order qryBarcodePay(@RequestBody Order hero) throws Exception {
....
}

也就是傳參的body前面一般會(huì)加上@RequestBody參數(shù),但是支付服務(wù)的接口用到了@ApiImplicitParam和@ApiIgnore 注解,屬于Swagger2的注解,有必要先學(xué)習(xí)下這兩個(gè)注解的基本使用:

但是呢,一開始沒(méi)想太多,調(diào)支付服務(wù)的feign接口的方法就按著平常寫的post接口來(lái):

@FeignClient(name="pay", path="pay")
public interface payFeignClient {
    @ResponseBody
    @RequestMapping(value = "/payment/order/select", method = RequestMethod.POST)
    @ApiOperation(value = "訂單查詢", notes = "訂單查詢")
    public Order qryBarcodePay(@RequestBody Order order);
}

然后在調(diào)式的時(shí)候,發(fā)現(xiàn)小程序調(diào)支付服務(wù)這個(gè)訂單查詢接口的時(shí)候,支付服務(wù)那邊接受的參數(shù)對(duì)象Order字段里面的值都是null,原因是feign這邊傳的Order對(duì)象是RequestBody類型,而支付服務(wù)那邊的接口接受參數(shù)時(shí)沒(méi)有加@RequestBody,所以應(yīng)該是反序列化的時(shí)候,由于格式不同,就沒(méi)有成功,才出現(xiàn)了支付服務(wù)這邊接受的參數(shù)對(duì)象Order字段里面的值都為null。

解決辦法

feign接口改成這樣子就正常了:

@FeignClient(name="pay", path="pay")
public interface payFeignClient {
    @RequestMapping(value = "/payment/qry/barcode/pay", method = RequestMethod.POST)
    @ApiOperation(value = "訂單查詢", notes = "訂單查詢")
    @Headers(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public ResultInfo<QryBarcodePayModel> qryBarcodePay(
            @RequestParam(required = true, name = "qryNo") String qryNo,
            @RequestParam(required = true, name = "hotelCode") String hotelCode);
}

這里對(duì)比一下feign和原接口的參數(shù)

原接口:

@ApiImplicitParams({
            @ApiImplicitParam(name = "queryNum", value = "查詢流水", paramType = "form", required = true),
            @ApiImplicitParam(name = "queryDate", value = "流水日期", paramType = "form", required = false)
    })
    public Order qryBarcodePay(@ApiIgnore Order hero)

feign接口:

@Headers(MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public ResultInfo<QryBarcodePayModel> qryBarcodePay(
            @RequestParam(required = true, name = "qryNo") String qryNo,
            @RequestParam(required = true, name = "hotelCode") String hotelCode);

可以看出來(lái)差別很大,首先傳參,原接口是post請(qǐng)求,傳的是一個(gè)對(duì)象,但是對(duì)象前加了@ApiIgnore 注解,相信前面給的鏈接學(xué)習(xí)后知道這個(gè)注解表示的是忽略的意思,也就是傳參的時(shí)候,忽略掉這個(gè)對(duì)象,所以feign傳的參壓根就沒(méi)有對(duì)象。

其次原接口對(duì)兩個(gè)參數(shù)加了@ApiImplicitParam,需要提前說(shuō)明的是,加了@ApiImplicitParam的兩個(gè)參數(shù)queryNum、queryDate都屬于Order 類里的屬性。

重點(diǎn)看@ApiImplicitParam的paramType = “form”, required = true這兩個(gè)地方,paramType="form"就表示傳參以form表單的形式,所以feign接口方法上面加了

@Headers(MediaType.APPLICATION_FORM_URLENCODED_VALUE)

其次require=true就表示這兩個(gè)參數(shù)是必傳的。

以上就確定了feign的接口方法應(yīng)該如何寫,最后參數(shù)到原接口過(guò)來(lái)時(shí),會(huì)自動(dòng)將queryNum、queryDate兩個(gè)參數(shù)set到Order對(duì)象里去,至于為何,我也不太清楚,暫時(shí)知道是可以這么用的。

使用@RequestParam、@RequestBody 的正確姿勢(shì)

背景

最近在使用 @RequestParam、@RequestBody 注解定義 feign 接口的時(shí)候出現(xiàn)一些使用上的問(wèn)題,造成調(diào)用方啟動(dòng)的時(shí)候會(huì)報(bào)錯(cuò)。

詳細(xì)情況

第一種情況,如下:

@PostMapping(value = "/hello2")
BetaDto hello2(String name1);

接口有且只有一個(gè) key/value 參數(shù),此時(shí)可以不必在 name1 參數(shù)上使用 @RequestParam 注解。通過(guò) Feign 調(diào)用該接口的調(diào)用方可以正常啟動(dòng)。

第二種情況,如下:

 @PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam String name1);

接口有且只有一個(gè) key/value 參數(shù),此時(shí)如果對(duì) name1 參數(shù)上使用 @RequestParam 注解,此時(shí)通過(guò) Feign 調(diào)用該接口的調(diào)用方可啟動(dòng)的時(shí)候回拋出如下錯(cuò)誤:

Caused by: java.lang.IllegalStateException: RequestParam.value() was empty on parameter 0

意思是 @RequestParam 的 value 值不允許為空,正確的姿勢(shì)如下:

 @PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam("name1") String name1);

第三種情況,如下:

@PostMapping(value = "/hello2")
BetaDto hello2(String name1, String name2);

接口存在多個(gè) key/value 參數(shù),此時(shí)通過(guò) Feign 調(diào)用該接口的調(diào)用方啟動(dòng)的時(shí)候會(huì)拋出如下錯(cuò)誤:

Caused by: java.lang.IllegalStateException: Method has too many Body parameters

像這種多參數(shù)(key/value)的情況必須為每個(gè)參數(shù)增加 @RequestParam 注解,正確的姿勢(shì)如下:

@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”)  String name1, @RequestParam(“name2”)  String name2);

小結(jié)一下

在使用 @RequestParam 注解的時(shí)候,value 值必須設(shè)置,如下:

@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”)  String name1);

如果接口有且只有一個(gè)參數(shù),并且該參數(shù)是 key/value 類型,則無(wú)需為該參數(shù)設(shè)置 @RequestParam 注解,如下:

@PostMapping(value = "/hello2")
BetaDto hello2(String name1);

接口存在多個(gè)參數(shù)(key/value、Json 對(duì)象)的時(shí)候,每個(gè) key/value 類型的參數(shù)必須顯示的指定 @RequestParam 注解,且必須設(shè)置對(duì)應(yīng)的 value

@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”) String name1, RequestParam(“name2”) String name2, BetaDto betaDto);

接口無(wú)論有多個(gè)參數(shù)還是一個(gè)參數(shù),都不需要為 Json 對(duì)象參數(shù)顯示的指定 @RequestBody 注解

@PostMapping(value = "/hello1")
BetaDto hello1(BetaDto betaDto);
@PostMapping(value = "/hello2")
BetaDto hello2(@RequestParam(“name1”) String name1, RequestParam(“name2”) String name2, BetaDto betaDto);

每個(gè)接口里只允許有一個(gè) JSON 對(duì)象類型的參數(shù),否則通過(guò) Feign 調(diào)用該接口的調(diào)用方啟動(dòng)的時(shí)候會(huì)拋出如下錯(cuò)誤:

Caused by: java.lang.IllegalStateException: Method has too many Body parameters

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java8新特性之字符串去重介紹

    Java8新特性之字符串去重介紹

    這篇文章主要介紹了Java8新特性之字符串去重介紹,新的字符串去重特性可以幫助減少應(yīng)用中String對(duì)象的內(nèi)存占用,目前該特性只適用于G1垃圾收集器,并且默認(rèn)不被開啟,需要的朋友可以參考下
    2014-09-09
  • Java對(duì)象在內(nèi)存中的布局是如何實(shí)現(xiàn)的?

    Java對(duì)象在內(nèi)存中的布局是如何實(shí)現(xiàn)的?

    Java對(duì)象在內(nèi)存中屬于oop-klass二分模型,即對(duì)象的實(shí)例數(shù)據(jù)和對(duì)象類型的元數(shù)據(jù)(字段定義、方法、常量池等元數(shù)據(jù))是分開存儲(chǔ)的.而由于JVM對(duì)對(duì)象內(nèi)相同寬度的字段分配在一起,所以只要指定了字段類型分配的順序,就可以計(jì)算出每種類型字段相對(duì)于當(dāng)前對(duì)象的偏移起始位置
    2021-06-06
  • Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的方案

    Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的方案

    我們?cè)陧?xiàng)目中經(jīng)常碰到需要讀取固定文件的場(chǎng)景,如模板文件,一般做法是將文件放在resources目錄下,程序通過(guò)多種方式可以順利讀取文件,這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目獲取resources目錄下文件并返回給前端的相關(guān)資料,需要的朋友可以參考下
    2024-07-07
  • 淺析Java基于Socket的文件傳輸案例

    淺析Java基于Socket的文件傳輸案例

    這篇文章主要針對(duì)Java基于Socket的文件傳輸案例進(jìn)行詳細(xì)解析,具有一定的參考價(jià)值,感興趣的朋友可以參考一下
    2016-02-02
  • Java解析http協(xié)議字符串的方法實(shí)現(xiàn)

    Java解析http協(xié)議字符串的方法實(shí)現(xiàn)

    本文主要介紹了Java解析http協(xié)議字符串的方法實(shí)現(xiàn),我們探討了如何使用Java解析HTTP協(xié)議字符串,并將其封裝成了一個(gè)HttpRequest類,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • Maven入門之使用Nexus搭建Maven私服及上傳下載jar包

    Maven入門之使用Nexus搭建Maven私服及上傳下載jar包

    這篇文章主要介紹了Maven入門之使用Nexus搭建Maven私服及上傳下載jar包,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • Nacos框架服務(wù)注冊(cè)實(shí)現(xiàn)流程

    Nacos框架服務(wù)注冊(cè)實(shí)現(xiàn)流程

    這篇文章主要介紹了SpringCloud服務(wù)注冊(cè)之nacos實(shí)現(xiàn)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • 如何在java 8 map中使用stream

    如何在java 8 map中使用stream

    這篇文章主要介紹了如何在java 8 map中使用stream,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • java 線程鎖詳細(xì)介紹及實(shí)例代碼

    java 線程鎖詳細(xì)介紹及實(shí)例代碼

    這篇文章主要介紹了java 線程鎖詳細(xì)介紹及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • maven中no main manifest attribute的問(wèn)題解決

    maven中no main manifest attribute的問(wèn)題解決

    本文主要介紹了maven中no main manifest attribute的問(wèn)題解決,這個(gè)錯(cuò)誤通常意味著Spring Boot應(yīng)用在啟動(dòng)時(shí)遇到了問(wèn)題,下面就來(lái)具體介紹一下,感興趣的可以了解一下
    2024-08-08

最新評(píng)論

吉安县| 滕州市| 台州市| 巴楚县| 浦城县| 庆安县| 广安市| 南昌市| 富平县| 河源市| 刚察县| 东兴市| 兴和县| 长岭县| 敦化市| 纳雍县| 政和县| 乐平市| 汕尾市| 家居| 镇远县| 米脂县| 大名县| 通城县| 崇州市| 望江县| 邵阳市| 赣州市| 遵义市| 郯城县| 酒泉市| 苏尼特右旗| 岑溪市| 岢岚县| 呼图壁县| 洪湖市| 额济纳旗| 偃师市| 大关县| 正安县| 盈江县|