实战篇:解决swagger和自定义参数解析器的功能冲突

本文详细探讨了Swagger与自定义参数解析器功能冲突的原因,包括注解依赖和对的依赖。解决方案涉及请求类型判定逻辑和Definition属性值填充逻辑的调整,通过切面编程修改原有行为,实现功能正常。
摘要由CSDN通过智能技术生成

前言

@RequestBody使用的参数解析器RequestResponseBodyMethodProcessor优先级高于我们自定义的参数解析器,所以为了正常使用,需要将@RequestBody 注解去掉。这就会导致swagger无法识别正确的参数类型,将请求体识别为Query Params,然后将body展开。

图片

 

可以看到,所有参数都被识别为ModelAttribute类型(query标志),而我们所期待的正确格式应当是如下样子

图片

因为该方式可以大大提高代码的可读性和可复用性,所以我们要知难而上,找出问题,解决问题!

问题产生的原因

产生这个问题的根本原因就是spring mvcswagger都对@RequestBody注解进行了单独的判定,功能上都依赖于该注解本身。

springmvc@RequestBody注解的依赖

就拿当前自定义的参数解析器来说,如果对请求参数加上了 @RequestBody 注解,对参数的反序列化会提前被RequestResponseBodyMethodProcessor拦截,自定义的参数解析器会失效。

具体源代码位置:https://github.com/spring-projects/spring-framework/blob/5.2.x/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/RequestResponseBodyMethodProcessor.java#L111

图片

可以看到,该参数解析器对加上@ReuqestBody注解的参数都支持解析,然后做序列化的操作。然而它在参数解析器列表中的优先级比较高,自定义的参数解析器添加到参数解析器列表之后会排在它的后面,所以如果加上@RequestBody注解,自定义的参数解析器就失效了。

因此使用自定义参数解析器一定不能使用@RequestBody注解

下图源代码位置:https://github.com/spring-projects/spring-framework/blob/5.2.x/spring-web/src/main/java/org/springframework/web/method/support/HandlerMethodArgumentResolverComposite.java#L129

图片

此案例中用到的自定义参数解析器为HdxArgumentResolver

swagger@Requestbody的依赖

经过调用栈追踪,最终发现在两个地方的功能会对@RequestBody注解有单独判定!(感兴趣的可以自行追踪😃)

  • 请求类型判定:也就是说POST请求类型是哪种类型,这决定了入参是否会作为Request Parameter被展开参数,也就是文中的第一张图,整个model

Swagger是一种用于描述、构建和生成RESTful风格的Web服务的工具集。它提供了一种简单且易于理解的方式来定义API的结构、参数、返回值等信息,并且可以生成可交互的API文档。 在Swagger中,`@ApiImplicitParam`是一个用于描述API接口参数的注解。它可以用于指定参数的名称、类型、位置、是否必需等信息。然而,从Swagger 3.0版本开始,`@ApiImplicitParam`已经被废弃,取而代之的是`@Parameter`注解。 `@Parameter`注解与`@ApiImplicitParam`类似,用于描述API接口参数。它可以指定参数的名称、类型、位置、是否必需等信息。与`@ApiImplicitParam`不同的是,`@Parameter`注解提供了更加灵活和可扩展的功能,可以支持更多的参数类型和配置选项。 使用`@Parameter`注解时,你可以通过设置`in`属性来指定参数的位置,例如`in = ParameterIn.PATH`表示参数位于URL路径中,`in = ParameterIn.QUERY`表示参数位于URL查询参数中,`in = ParameterIn.HEADER`表示参数位于请求头中,等等。 此外,你还可以使用`@Parameter`注解的其他属性来指定参数的名称、类型、是否必需等信息。例如,你可以使用`name`属性指定参数的名称,使用`schema`属性指定参数的数据类型,使用`required`属性指定参数是否必需等。 总结一下,`@Parameter`注解是Swagger 3.0版本中用于描述API接口参数的注解,它提供了更加灵活和可扩展的功能,可以替代`@ApiImplicitParam`注解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值