欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

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

比如小程序調(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;
    }

這個post接口,有點奇怪,多了很多沒見過的注解,而一般情況,post接口里參數(shù)對象應(yīng)該是這么寫的:

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

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

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

@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)式的時候,發(fā)現(xiàn)小程序調(diào)支付服務(wù)這個訂單查詢接口的時候,支付服務(wù)那邊接受的參數(shù)對象Order字段里面的值都是null,原因是feign這邊傳的Order對象是RequestBody類型,而支付服務(wù)那邊的接口接受參數(shù)時沒有加@RequestBody,所以應(yīng)該是反序列化的時候,由于格式不同,就沒有成功,才出現(xiàn)了支付服務(wù)這邊接受的參數(shù)對象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);
}

這里對比一下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);

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

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

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

@Headers(MediaType.APPLICATION_FORM_URLENCODED_VALUE)

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

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

使用@RequestParam、@RequestBody 的正確姿勢

背景

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

詳細(xì)情況

第一種情況,如下:

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

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

第二種情況,如下:

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

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

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

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

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

第三種情況,如下:

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

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

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

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

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

小結(jié)一下

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

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

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

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

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

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

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

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

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

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

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

相關(guān)文章

  • java如何獲取本機IP地址

    java如何獲取本機IP地址

    這篇文章主要為大家詳細(xì)介紹了java如何獲取本機IP地址,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • lombok?子類中如何使用@Builder問題

    lombok?子類中如何使用@Builder問題

    這篇文章主要介紹了lombok?子類中如何使用@Builder問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Java Stream流知識總結(jié)

    Java Stream流知識總結(jié)

    這篇文章主要介紹了Java Stream流的相關(guān)知識,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • java刪除文件夾下所有文件示例分享

    java刪除文件夾下所有文件示例分享

    這篇文章主要介紹了java刪除文件夾下所有文件示例,需要的朋友可以參考下
    2014-02-02
  • mybatis-plus在yml中配置詳解

    mybatis-plus在yml中配置詳解

    本文主要介紹了mybatis-plus在yml中配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • 使用AOP+反射實現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢

    使用AOP+反射實現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢

    這篇文章主要介紹了使用AOP+反射實現(xiàn)自定義Mybatis多表關(guān)聯(lián),目前的需求是增強現(xiàn)有的查詢,使用簡單的注解即可實現(xiàn)多表關(guān)聯(lián),本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • java 中HttpClient傳輸xml字符串實例詳解

    java 中HttpClient傳輸xml字符串實例詳解

    這篇文章主要介紹了java 中HttpClient傳輸xml字符串實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Java Map的幾種循環(huán)方式總結(jié)

    Java Map的幾種循環(huán)方式總結(jié)

    這篇文章主要是對Java中Map的幾種循環(huán)方式進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2013-12-12
  • Java并發(fā)編程之常用的輔助類詳解

    Java并發(fā)編程之常用的輔助類詳解

    這篇文章主要給大家介紹了關(guān)于Java并發(fā)編程之常用的輔助類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)

    Java解析xml文件和json轉(zhuǎn)換的方法(DOM4j解析)

    相信大家都知道Java解析xml的方法有四種,每種方法都很不錯,今天通過本文給大家分享使用DOM4j進(jìn)行解析的方法,文章通過兩種方法給大家進(jìn)行解析,感興趣的朋友一起看看吧
    2021-08-08

最新評論