Swagger UI错误请求URL生成

时间:2017-06-03 16:59:15

标签: java spring swagger swagger-ui springfox

我现在已经使用了一段时间,现在我遇到了一个问题,即生成的请求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-ui中的结果URL如下所示: Swagger Bad URL

当我尝试使用它时,它会将这些内容放入REST请求中。 REST request with optional params

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

我尝试在互联网上搜索,swagger页面,这里在stackoverflow上,我找不到任何提及此错误。非常奇怪的是,如果我将RequestMethod更改为POST,它就可以正常工作。似乎是swagger-ui处理可选参数的错误。其他人遇到过这个?除了使请求方法POST之外还有一个修复吗?

编辑:&#34;消费=&#34; application / x-www-form-urlencoded&#34;&#34;不是我的原始代码。我一直在调试这个并添加一些东西试试让它工作lol。

使用的版本:

  • springfox-swagger2 版本 2.6.1
  • springfox-swagger-ui 2.6.1

1 个答案:

答案 0 :(得分:1)

你使用的是什么版本的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)。在这种情况下,一切都将起作用,但如果您有多个具有不同查询参数的路径,则只会显示其中一个。
  2. e.g。如果你有以下网址 http://example.org/customers?firstName=A&lastName=B findCustomersByName http://example.org/customers?email=a@b.com findCustomersByEmail

    只会出现其中一个。

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