0
点赞
收藏
分享

微信扫一扫

【Java异常】Caused by: java.lang.IllegalStateException: Method has too many Body parameters

IT影子 2022-04-18 阅读 89
微服务

1、错误信息

Caused by: java.lang.IllegalStateException: Method has too many Body parameters: public abstract com.cluster.gateway.result.ResultBody com.cluster.gateway.model.orders.service.ModelOrdersService.do2Payment(java.lang.String,int)
Warnings:
- 
	at feign.Util.checkState(Util.java:129)
	at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:127)
	at org.springframework.cloud.openfeign.support.SpringMvcContract.parseAndValidateMetadata(SpringMvcContract.java:194)
	at feign.Contract$BaseContract.parseAndValidateMetadata(Contract.java:62)
	at feign.ReflectiveFeign$ParseHandlersByName.apply(ReflectiveFeign.java:151)
	at feign.ReflectiveFeign.newInstance(ReflectiveFeign.java:49)
	at feign.Feign$Builder.target(Feign.java:269)
	at org.springframework.cloud.openfeign.HystrixTargeter.target(HystrixTargeter.java:38)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.loadBalance(FeignClientFactoryBean.java:301)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getTarget(FeignClientFactoryBean.java:330)
	at org.springframework.cloud.openfeign.FeignClientFactoryBean.getObject(FeignClientFactoryBean.java:310)
	at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:169)
	... 49 common frames omitted

2、错误原因

报错信息翻译过来就是:方法有太多的Body参数。根据错误提示信息,可以看到具体的是哪个方法,然后找到对应的方法,查看参数是否有误,当通过Feign客户端调用其他服务的接口时,请求参数可以有多个,用spring自带的注解用的方式不对,所以才导致报错。在同一个方法参数位置,@RequestParam注解可以用多个,但是 @RequestBody 注解只能用一个。

以下是我项目里用的方式,String devModel, String eventId这两个参数没有用@RequestParam注解说明,导致上述报错。

/**
     * 支付下单
     *
     * @param tradeNo 订单号
     * @return:
     * @author: Thomas
     * @date: 2022/3/8 17:36
     */
    @ResponseBody
    @PostMapping(value = ("/service/order/do2Payment"))
    ResultBody do2Payment(@RequestBody String tradeNo, @RequestBody int selectBankId);

3、解决方案

解决方法其实很简单,在方法的参数上加上@RequestParam注解(同时可以用多个)即可。这里有两个参数,加上两个 @RequestParam注解。如果有一个对象参数是要用@RequestBody注解的(这个注解同时只能用一个)。

    /**
     * 支付下单
     *
     * @param tradeNo 订单号
     * @return:
     * @author: Thomas
     * @date: 2022/3/8 17:36
     */
    @ResponseBody
    @PostMapping(value = ("/service/order/do2Payment"))
    ResultBody do2Payment(@RequestParam String tradeNo, @RequestParam int selectBankId);
举报

相关推荐

0 条评论