API 接口定义 添加 @ApiOperation 注解触发中间件 bug 问题分析

背景

我有一个服务 A ,写了一个接口定义如下:


@RequestMapping({"/config/coupon"})
public interface CouponOperateTaskService {@PostMapping({"/list"})@ApiOperation("优惠券操作任务列表")BizPageResponse<CouponOperateListResponse> couponOperateList(@RequestBody @Validated CouponOperateRequest request);
}

打了一个 api 的jar 包发布到 maven 仓库,被 服务 B 引用:

@FeignClient(name = "ext-service-mkt-coupon-config", configuration = FeignSupportConfig.class)
public interface CouponOperateTaskClient extends CouponOperateTaskService {}

B 服务进行调用:

@Resourceprivate CouponOperateTaskClient operateTaskClient;@ApiOperation("优惠券操作任务列表")public BizPageResponse<CouponOperateListResponse> couponOperateTaskList(@RequestBody @Validated CouponOperateRequest request) {return operateTaskClient.couponOperateList(request);}

调用之后response就会返回异常信息:

{"code": 10025,"message": "系统异常,错误码:null","data": {"results": [],"total": 0,"pageCount": 0,"currentIndex": 0,"hasNext": false}
}

更诡异的是并且控制台和日志系统都搜不到错误日志。

分析

上面为背景,经过分析后,有两个问题需要解决:

  1. 为什么会报错?
  2. 为什么没有日志?

我们先看第二个问题,为什么没有错误日志。

据我所知,我们的项目中间件同一封装了全局的日常处理类,那为啥没有生效呢?找到封装好的 异常处理类:com.tuhu.springcloud.common.advice.ExceptionHandlerAdvice

@ConditionalOnClass(BizResponse.class)
@RestControllerAdvice
@Slf4j
public class ExceptionHandlerAdvice {/*** 参数异常处理** @param validException validException* @return BizBaseResponse*/@ExceptionHandler(value = { MethodArgumentNotValidException.class, BindException.class })@ResponseStatus(value = HttpStatus.OK)@ResponseBody@SuppressWarnings({ "rawtypes" })public BizResponse handleMethodArgumentNotValidException(Exception validException) {log.info("SC服务请求参数有误:{}", validException.getMessage(), validException);BindingResult bindingResult = null;if (validException instanceof MethodArgumentNotValidException) {bindingResult = ((MethodArgumentNotValidException) validException).getBindingResult();} else if (validException instanceof BindException) {bindingResult = ((BindException) validException).getBindingResult();}if (null == bindingResult || null == bindingResult.getFieldError()) {return new BizResponse<>(BizErrorCodeEnum.PARAM_ERROR);}return new BizResponse<>(BizErrorCodeEnum.PARAM_ERROR, bindingResult.getFieldError().getDefaultMessage());}}

发现 @ConditionalOnClass(BizResponse.class) 只针对 BizResponse.class 的响应封装有效,踩坑+1 !!!

那我们先改为 BizResponse 的响应试试呢?

    @Resourceprivate CouponOperateTaskClient operateTaskClient;@ApiOperation("优惠券操作任务列表")public BizResponse<CouponOperateListResponse> couponOperateTaskList(@RequestBody @Validated CouponOperateRequest request) {BizPageResponse<CouponOperateListResponse> couponOperateListResponseBizPageResponse = operateTaskClient.couponOperateList(request);return BizResponse.success();}

这次我们把 Response 改为 BizResponse 封装的,那 com.tuhu.springcloud.common.advice.ExceptionHandlerAdvice这个异常拦截应该能够拦截到了吧,试试看:

{"code": 10025,"message": "系统异常,错误码:null","data": null
}

结果,试试就逝世!

记一次API 接口定义 添加 @ApiOperation 注解触发中间件 bug 问题分析相关推荐

  1. java若依框架开发api接口(添加新模块)

    在java的spingboot框架中比较好的开源后台那必须是若依了!为了方便管理自己开发的api接口,添加自己的模块,将api接口统一管理在该模块中! 记得三连哦~ 1.下载若依admin,链接:Ru ...

  2. 萤石开放平台——怎么通过API接口远程添加摄像头?

    高科技摄像头特别是海康萤石摄像头,已经不再只局限于简单的视频功能,特别是智能AI的普及,摄像头也华丽变身成了一个个独立的智能个体,可以实现人脸抓拍,人形检测,客流统计等店铺值守场景,也可以实现安全帽识 ...

  3. 我的编码习惯 —— API 接口定义

    工作中,少不了要定义各种接口,系统集成要定义接口,前后台掉调用也要定义接口.接口定义一定程度上能反应程序员的编程功底.列举一下工作中我发现大家容易出现的问题: 1. 返回格式不统一 同一个接口,有时候 ...

  4. 上传图片-服务端-Api接口定义

    API接口 模型类 系统的文件信息(图片.文档等小文件的信息)在mongodb中存储,下边是文件信息的模型类. 1) 模型如下: package com.learn.framework.domain. ...

  5. 【Abp VNext】实战入门(七):【1】xxx.Web网站层 —— API接口服务添加跨域访问支持

    一.前言 通过命令 abp new AoRuiDe.GasMonitoring 或者直接从官网下载的项目,默认没做跨域配置,会导致在前后端分离的网页中去访问后端接口的时候报错"Access- ...

  6. Controller规范和接口定义,添加一条新数据并返回此数据的ID(主键)

    参考文章: 烂代码之:Controller规范和接口定义 添加一条新数据并返回此数据的ID(主键) 删除数据返回boolean 添加数据后返回Id <insert id="" ...

  7. Swagger3 API接口文档规范课程(Java1234)(内含教学视频+源代码)

    Swagger3 API接口文档规范课程(Java1234)(内含教学视频+源代码) 教学视频+源代码下载链接地址:https://download.csdn.net/download/weixin_ ...

  8. 各种快递查询Api接口(快递鸟)

    文章目录 #应用场景 #申请Key #快递查询Api接口 #前提 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的是快递的查询Api及与其他各家的不同之处: 常用的提供快递Api ...

  9. 快递鸟查询Api接口使用(PHP版)

    前提 项目开发中,有些需求难免会用到关于快递的一些Api接口:本篇主要介绍的是快递的查询Api及与其他各家的不同之处: 常用的提供快递Api接口的有: 快递鸟 快递100 爱查快递  等等 如大家使用 ...

最新文章

  1. 【机器学习基础】如何在Python中处理不平衡数据
  2. Python用@property使类方法像属性一样访问
  3. [Java基础]String对象的特点(易错点)
  4. 学会用taro封装一个组件
  5. 设置TextField内文字距左边框的距离
  6. meta 标签的作用
  7. 小米浏览器禁用java_小米手机调试总出现“INSTALL_CANCELED_BY_USER”
  8. 【电脑使用】插入SD卡图标是灰色的,点击显示“请将磁盘插入驱动器”
  9. studio和solo哪个好_beats studio3 和solo3的区别再哪里?
  10. Ubuntu下载软件包网速过慢的解决方法
  11. Twaver-HTML5基础学习(33)自动布局
  12. 编程序找出1000之内的所有完数,并输出其因子
  13. python在大数据分析中的应用
  14. 大数据学习总结(2021版)---Mysql基础
  15. Excel表格生成sql数据
  16. 机器学习深度学习加强学习_我如何在9个月内学习深度学习
  17. 青春无言│用技术定格毕业季最美好的回忆
  18. 【GridMask】《GridMask Data Augmentation》
  19. 关于qt.qpa.plugin: Could not load the Qt platform plugin “xcb“的问题
  20. 组成计算机系统的是__,一个完整的计算机系统的组成部分的确切提法应该是______...

热门文章

  1. Code::blocks的安装以及使用方法
  2. 水利水电安装工程项目管理信息系统
  3. 关于Google的两条消息
  4. 用DQN实现Atari game(Matlab代码实现)
  5. 分析int(*p)[4] = a
  6. 这几类考研考生注意了!
  7. 如何从Ropsten测试网络上获得MetaMask测试币
  8. 日趋“四低”的智能手环,出路在哪?
  9. 【旅游攻略】安化云台山风景区的童心之旅
  10. 使用Bootstrap构建琮元科技宣传网站