【问题标题】:Optional query string enum parameter - openapi, springboot可选查询字符串枚举参数——openapi、springboot
【发布时间】:2019-08-23 16:50:52
【问题描述】:

我有一个 OpenApi 规范:

paths:
  /lessons:
    get:
      tags:
        - lesson
      operationId: getLessons
      parameters:
        - in: query
          name: daysOfWeek
          schema:
            type: array
            items:
              $ref: '#/components/schemas/DaysOfWeekEnum'

使用 swagger codegen 这会生成一个端点,如:

 @ApiOperation(value = "Get a collection lessons", nickname = "getLessons", notes = "", response = LessonDto.class, responseContainer = "List", tags={ "lesson", })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "List of Lessons", response = LessonDto.class, responseContainer = "List") })
    @RequestMapping(value = "/lessons",
        produces = { "application/json" }, 
        method = RequestMethod.GET)
    default ResponseEntity<List<LessonDto>> _getLessons(@ApiParam(removed for brevity) @Valid @RequestParam(value = "daysOfWeek", required = false, defaultValue="new ArrayList<>()") List<DaysOfWeekEnum> daysOfWeek) {
        return getLessons(daysOfWeek);
    }

我在这样的测试中使用 TestRestTemplate

ResponseEntity<List<LessonDto>> lessonDtos =
        testRestTemplate.exchange("/lessons", HttpMethod.GET, null,
            new ParameterizedTypeReference<List<LessonDto>>() {
            });

这个网址有效:

/lessons?daysOfWeek=THURSDAY

这些网址不:

/lessons
/lessons?daysOfWeek=SOME_INVALID_VALUE

...我收到以下错误:

嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:不能 从 START_OBJECT 中反序列化 java.util.ArrayList 的实例 令牌

任何帮助表示赞赏。

【问题讨论】:

    标签: spring-boot spring-mvc swagger openapi


    【解决方案1】:

    为了给你一个empty list,你需要将默认值设置为一个空字符串:

    @RequestParam(value = "daysOfWeek", 
                  required = false, 
                  defaultValue = "") List<DaysOfWeekEnum> daysOfWeek) 
    

    【讨论】:

      【解决方案2】:

      所以问题与openapi-generator bug 有关。总结是:

      将数组类型的参数添加到操作中时,生成的 Spring 代码在 Spring MVC 中包含无效的 defaultValue 参数注释

      解决方法是升级到更高版本的 openapi-generator - 4.0.0 对我有用。

      顺便说一句,错误信息:

      例外是 com.fasterxml.jackson.databind.exc.MismatchedInputException:不能 从 START_OBJECT 令牌中反序列化 java.util.ArrayList 的实例

      .. 有点牵强附会,它实际上与TestRestTemplate 相关,即ParameterizedTypeReference 部分。将其更改为 String.class 确定了错误的真实性质。

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 2021-06-02
        • 2023-02-09
        • 1970-01-01
        • 1970-01-01
        • 2019-03-24
        • 2021-01-14
        相关资源
        最近更新 更多