Restlet Swagger中Query参数注解被误生成为Body参数如何解决
问题描述
我有一个使用Restlet Swagger扩展的Restlet API应用,通过Swagger2SpecificationRestlet生成Swagger JSON,相关配置代码如下:
// route to generated swagger json swagger2SpecificationRestlet.attach(router, "/docs");
路由定义方式如下:
router.attach("/path/{pathParam}", MyResource.class);
本地部署了swagger-ui,初始化URL设置为从/docs路径读取Swagger JSON。当前UI对所有路由的展示均符合预期,包括必填路径参数输入项,但查询参数的注解却被渲染为请求体参数,且未携带其余已定义的字段,生成的parameters配置如下:
"parameters": [ { "name": "pathParam", "in": "path", "required": true, "type": "string" }, { "in": "body", "name": "body", "required": false, "schema": { "type": "string" } ],
添加了注解的资源方法代码如下:
@ApiOperation( value="test desc", httpMethod = "GET", produces = "application/json", notes="testing notes" ) @Get("txt") public String represent( @ApiParam(name="queryParam", value = "testing desc") @QueryParam("queryParam") String queryParam ) throws SQLException { ... }
需求为找到正确的查询参数注解方式,让Swagger生成正确的JSON配置。
解决方案
这个问题由两类原因导致,按顺序排查修改即可:
- 没有在
@ApiParam注解里显式指定参数位置。Restlet的Swagger扩展不会自动读取@QueryParam注解来判断参数类型,只要@ApiParam没配置in属性,就会默认把方法入参当成请求体参数处理。给@ApiParam补上in = "query"属性就行,改完的参数注解写法:
@ApiParam(name="queryParam", value = "testing desc", in = "query") @QueryParam("queryParam") String queryParam
- 依赖版本有已知bug。如果你用的是2.3.x系列的早期版Restlet Swagger扩展,本身就存在JAX-RS参数注解(
@QueryParam、@PathParam这类)和Swagger注解的映射bug,就算注解写对了也识别不了,直接升级到2.3.12及以上的稳定版本就能修复。
按HTTP规范,GET请求本身就不支持传请求体,GET接口自动生成body参数的问题,基本都是上面两个原因,不用去查路由或者Swagger UI的配置。
改完重启应用,再访问/docs拿到的Swagger JSON里,queryParam就会被正确识别为查询参数,配置的参数描述之类的字段也会正常显示在Swagger UI上。
内容的提问来源于stack exchange,提问作者Don
相关产品推荐
相关产品推荐

