一、背景

  • 接口定义:

@ApiOperation(value = "分页查询会话")

@PostMapping(Routes.SESSIONS_QUERY)

JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo,

@PageableDefault(size = 20, sort = "id", direction = Sort.Direction.DESC) Pageable pageable);

  • 服务消费方调用报错:

Method has too many Body parameters: public abstract com.xingren.common.data.JsonResult com.xingren.xxx.yyy.contract.api.controller.ISessionController.querySessions(com.xingren.xxx.yyy.contract.qo.SessionsQo,org.springframework.data.domain.Pageable)

二、解决

通言七墨过搜索、https://qimok.cn调研,目前有三种解决方法:

1、将分页属性直接通过入参传递,接口定义如下:


@ApiOperation(value = "分页查询会话")

@PostMapping(Routes.SESSIONS_QUERY)

JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo,

@RequestParam("page") Integer page, @RequestParam("size") Integer size, @RequestParam("sort") Sort sort);

2、将分页对象冗余在Qo中(通过继承实现):


@Data

@NoArgsConstructor

@ApiModel(value = "查询会话")

public class SessionsQo extends PageableParam {

@ApiParam(value = "会话id列表")

private List<Long> sessionIdIn = Lists.newArrayList();

...

}

3、通过注解传递(参考:Issue):

  1. 服务提供方定义注解:

@Target(ElementType.PARAMETER)

@Retention(RetentionPolicy.RUNTIME)

public @interface PageableParam {

}

  1. 服务提供方定义接口:

@ApiOperation(value = "分页查询会话")

@PostMapping(Routes.SESSIONS_QUERY)

JsonResult<Pagination<SessionInfo>> querySessions(@RequestBody @Valid SessionsQo qo,

@PageableParam @SpringQueryMap Pageable pageable);

  1. 服务消费方定义processor

@Bean

public PageableParamProcessor pageableParamProcessor() {

return new PageableParamProcessor();

}

public static class PageableParamProcessor implements AnnotatedParameterProcessor {

private static final Class<PageableParam> ANNOTATION = PageableParam.class;

@Override

public Class<? extends Annotation> getAnnotationType() {

return ANNOTATION;

}

@Override

public boolean processArgument(AnnotatedParameterContext context, Annotation annotation, Method method) {

int parameterIndex = context.getParameterIndex();

MethodMetadata data = context.getMethodMetadata();

data.queryMapIndex(parameterIndex);

return true;

}

}

  1. 服务消费方自定义PageableUtil

public class PageableUtil extends PageRequest implements Map<String, Object> {

public static final String PAGE = "page";

public static final String SIZE = "size";

public static final String SORT = "sort";

@Delegate

protected Map<String, Object> delegate = Maps.newHashMap();

public PageableUtil(int page, int size, Sort sort) {

super(page, size, sort);

delegate.put(PAGE, page);

delegate.put(SIZE, size);

if (Objects.nonNull(sort)) {

delegate.put(SORT, sort.toString().replace(": ", ","));

}

}

public PageableUtil(int page, int size) {

super(page, size);

delegate.put(PAGE, page);

delegate.put(SIZE, size);

}

}

  • 定义PageableUtil原因:主要是因为FeignQueryMap类型参数的序列化和反序列化的言七墨方式与Sort.Order的不兼容,导致排序失效。
  1. 服务消费方调用方式:

SessionsQo qo = SessionsQo.builder().sessionIdIn(Collections.singletonList(20L)).build();

JsonResult<Pagination<SessionInfo>> pageInfo = sessionContract.querySessions(qo, new PageableUtil(0, 5, new Sort(Sort.Direction.DESC,

来源:使用 Feign 调用分页接口报错:Method has too many Body parameters | 七墨博客

使用 Feign 调用分页接口报错:Method has too many Body parameters(亲测)相关推荐

  1. 关于微信 调用js-sdk接口报错的问题

    最近在做一个微信服务号的开发,服务器是腾讯云centos的(呵呵,貌似和服务器的关系不大).后台一直报错空指针nullpointerexception.开启了微信debug模式,查看报错是invali ...

  2. gogs mysql 报错_linux上Docker安装gogs私服亲测(详解)

    一.前言 有网友问我为什么要使用私服,可能大部分人都不是太懂,网上那么多存储仓库而且好用方便,但是你想过没有如果企业中的项目,放在人家的仓库上这个安全性不是太好,所以说一般企业都会有自己的私服.本章教 ...

  3. mysql数据库-1.文件导入mysql表secure_file_priv报错问题解决 mysql select outfile不能导出亲测

    1.问题 Mac系统,将文件导入mysql表中,报错secure_file_priv选项未设置. 执行导入文件到表mobile_attribute_jxl命令时: load data infile ' ...

  4. win10应用商店报错提示0x80072EE7怎么解决?(亲测,一次性解决)

    win10应用商店报错提示0x80072EE7怎么解决 前言 不少用户在win10系统使用应用商店时出现打不开,并提示错误代码0x80072ee7,那么应用商店0x80072ee7错误问题要怎么解决呢 ...

  5. 调用 微信接口报错 {errcode:48001,errmsg:api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]}...

    如下截图,仅为备份,本文转载地址: http://www.cnblogs.com/liaolongjun/p/6080240.html 以下正文↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ...

  6. EasyCVR调用录像回看接口报错“查询文件失败”排查过程及解决方式

    EasyCVR视频平台是TSINGSEE青犀视频开发的极具协议包容性的综合性视频融合云服务平台,支持RTSP.RTMP.GB28181.Ehome.HIKSDK等协议,目前更多协议仍在拓展当中.Eas ...

  7. 调用微信的接口报错errcode: 40164 invalid ip

    调用微信的接口报错errcode: 40164 调用微信的接口报错 { errcode: 40164, errmsg: 'invalid ip 117.100.47.169 ipv6 ::ffff:1 ...

  8. feign调用service_Spring-cloud-eureka使用feign调用服务接口

    Spring-cloud-eureka使用feign调用服务接口的具体方法,供大家参考,具体内容如下 基于spring-boot 2.0以上版本完成的微服务架构 pom.xml org.springf ...

  9. java调用oracle过程,JAVA调用ORACLE存储过程报错

    当前位置:我的异常网» Java Web开发 » JAVA调用ORACLE存储过程报错 JAVA调用ORACLE存储过程报错 www.myexceptions.net  网友分享于:2015-07-1 ...

最新文章

  1. C++多线程之间,线程函数启动之后,多线程依赖的启动和线程唤醒操作。
  2. 把项目发到github
  3. @MarkFan 口语练习录音 20140415 [MDL演讲口语录音]
  4. unix系统mysql卸载教程_Linux操作系统下MySQL的卸载、安装全过程
  5. mongodb从2.6迁移到3.0过程
  6. alias cli3 配置_vue-cli3项目搭建配置以及性能优化
  7. php怎么修改滑动条,修改滚动条样式的方法
  8. HDU2080 夹角有多大II【数学】
  9. bzoj 3111: [Zjoi2013]蚂蚁寻路(DP)
  10. FreeRADIUS服务器搭建及配置
  11. 1.9w粉丝带动近100w播放量,推广黑马不止一位
  12. 码农翻身之我是一个线程 --- 读书笔记
  13. 淘宝补单发货地不一样可以吗?正确补单流程是什么?
  14. 基于主从博弈的智能小区代理商定价策略及 电动汽车充电管理matlab程序(yalmip+cplex)(yalmip+gurobi)
  15. 腾讯安全发布《2020年上半年手机安全报告》,揭示手机安全四大趋势
  16. 学会计为什么要学计算机基础,会计实操为什么要学习手工做账?
  17. 献给经常加班熬夜的你们
  18. 能够语义化的编写html文档,HTML语义化 - 写给未来的自己 - OSCHINA - 中文开源技术交流社区...
  19. go每日新闻--2021-01-03
  20. 【ESP32】1.Arduino IDE 2.0安装详解

热门文章

  1. QT的QOpenGLDebugLogger类的使用
  2. C语言二级指针内存模型建立
  3. docker 返回错误信息与本地不一致_Docker基本配置及常用命令
  4. IntelliJ IDEA使用(一):创建maven web项目
  5. 1线程概念:线程和进程之间的关系,线程间可共享资源,线程间非共享资源,线程的优缺点
  6. hibernate.jdbc.fetch_size 和 hibernate.jdbc.batch_size
  7. 【TensorFlow】tf.nn.softmax_cross_entropy_with_logits 函数:求交叉熵损失
  8. 设备树(device tree)学习笔记
  9. 使用register_chrdev注册字符设备
  10. 微信小程序 - 文字收缩与展开