Swagger UI 错误请求 URL 生成

Swagger UI Bad Request URL Generation

我已经使用 swagger 一段时间了,现在 运行 遇到一个问题,即生成的请求 URL 将我的可选参数放入请求中。这不会发生在我拥有的其他使用相同注释、swagger 版本和 swagger maven 版本的项目上。

这是我的@Controller

中的代码片段
private static final String BY_USERNAME = "byUsername";
private static final String BY_NAME = "byName";
private static final String BY_PHONENUMBER = "byPhoneNumber";
private static final String BY_USERTYPENAME = "byUserTypeName";
private static final String BY_ACTIVE = "byActive";
private static final String BY_ACTIVE_AND_AVAILABLE = "byActiveAndAvailable";
@ApiOperation(value = "Read User(s)", notes = "notes removed so post wont be so long", consumes = "application/x-www-form-urlencoded")
@RequestMapping(value = "", method = RequestMethod.GET, consumes = "application/x-www-form-urlencoded")
@ApiImplicitParam(value = "Authorization Token", name = TokenAuthenticationService.HEADER_STRING, dataType = "String", paramType = "header")
@ApiResponses(value = { @ApiResponse(message = "successful read call", code = 200), @ApiResponse(message = "bad parameter provided", code = 400) })
public Page<User> readUser(
                @ApiParam(name = "queryType", value = "type of query", allowableValues = BY_USERNAME + "," + BY_NAME + "," + BY_PHONENUMBER + ","
                                + BY_USERTYPENAME + "," + BY_ACTIVE + "," + BY_ACTIVE_AND_AVAILABLE) @RequestParam(value = "queryType", required = true) String queryType,
                @ApiParam(name = "username", value = "username of user") @RequestParam(value = "username", required = false) String username,
                @ApiParam(name = "name", value = "name of user(s)") @RequestParam(value = "name", required = false) String name,
                @ApiParam(name = "phoneNumber", value = "phone number of user(s)") @RequestParam(value = "phoneNumber", required = false) String phoneNumber,
                @ApiParam(name = "userTypeName", value = "user type name of user(s)") @RequestParam(value = "userTypeName", required = false) String userTypeName,
                @ApiParam(name = "active", value = "active status of user(s)") @RequestParam(value = "active", required = false) Boolean active,
                @ApiParam(name = "available", value = "available status of user(s)") @RequestParam(value = "available", required = false) Boolean available,
                Pageable pageable) {

这是非常基本的 swagger 注释。问题是 swagger-ui 中的结果 URL 看起来像这样:

当我尝试使用它时,它会将这些放入 REST 请求中。

这当然会导致 spring 抛出关于无效字符的异常

我尝试在整个 Internet、swagger 页面和 Whosebug 上进行搜索,但我找不到任何提及此错误的信息。非常奇怪的是,如果我将 RequestMethod 更改为 POST 它会正常工作。似乎是 swagger-ui 处理可选参数的错误。还有其他人 运行 参与其中吗?除了使请求方法 POST 之外还有解决方法吗?

编辑:"consumes = "application/x-www-form-urlencoded"" 不在我的原始代码中。我一直在调试这个并添加一些东西来尝试让它工作哈哈。

使用的版本:

您使用的是哪个版本的 swagger-ui?

由于您的摘要中有 enableUrlTemplating(true),因此您需要使用支持它的 swagger-ui 的适当实现。

对于Gradle:

compile group: 'io.springfox.ui', name: 'springfox-swagger-ui-rfc6570', version: '1.0.0'

对于 Maven:

<!-- https://mvnrepository.com/artifact/io.springfox.ui/springfox-swagger-ui-rfc6570 -->
<dependency>
    <groupId>io.springfox.ui</groupId>
    <artifactId>springfox-swagger-ui-rfc6570</artifactId>
    <version>1.0.0</version>
</dependency>

Docket 支持 url templating(参见 #21),但它仍处于孵化阶段,并没有得到 swagger 2.0 规范的正式支持。所以你的选择是:

  1. 制作enableUrlTemplating(false)。在这种情况下,一切都会正常工作,但如果您有多个具有不同查询参数的路径,则只会显示其中一个。

例如如果您有以下网址 http://example.org/customers?firstName=A&lastName=B findCustomersByName http://example.org/customers?email=a@b.comfindCustomersByEmail

只有其中一个会出现。

  1. 保留 enableUrlTemplating(true)change the swagger-ui 您正在使用上面的那个。