【问题标题】:Why is object query parameter null?为什么对象查询参数为空?
【发布时间】:2019-06-09 14:47:20
【问题描述】:

我在我的 Spring Boot 应用程序中描述了 openapi 文件中的路径。 Openapi 由处理 http 请求的文件 api 类生成。 我也使用 swagger 来构造一个有效的 url,我也可以在其中放置查询参数。 我想知道,为什么让所有这些生成的员工收到空对象而不是预期的对象。

api.yaml 的一部分

/films:
    get:
      summary: Отфильтрованные фильмы
      operationId: findFilms
      tags: [selections]
      parameters:
        - in: query
          name: filter
          schema:
            type: object
            properties:
              genreId:
                type: integer
              year:
                type: integer
              countryId:
                type: integer
          style: deepObject
          explode: false
      responses:
        200:
          description: successfull response
          content:
            application/json:
              schema:
                $ref: 'list-schemas.yaml#/components/schemas/SelectionTo'

生成的java类

@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen")

@Validated
@Api(value = "Selections")
public interface SelectionsApi {

    default Optional<NativeWebRequest> getRequest() {
        return Optional.empty();
    }

    @ApiOperation(value = "Отфильтрованные фильмы", nickname = "findFilms", , response = SelectionTo.class, tags={ "selections", })
    @ApiResponses(value = { 
        @ApiResponse(code = 200, message = "successful response", response = SelectionTo.class) })
    @RequestMapping(value = "/films",
        produces = { "application/json" }, 
        method = RequestMethod.GET)
    default ResponseEntity<SelectionTo> _findFilms(@ApiParam() @Valid @RequestParam(value = "filter", required = false) Filter filter) {
        return findFilms(filter);
    }

    // Override this method
    default ResponseEntity<SelectionTo> findFilms(Filter filter) {
        getRequest().ifPresent(request -> {
            ...
        });
        return new ResponseEntity<>(HttpStatus.NOT_IMPLEMENTED);

    }

生成的查询参数类

@javax.annotation.Generated(value = "org.openapitools.codegen.languages.SpringCodegen")

public class Filter   {
  @JsonProperty("genreId")
  private Integer genreId = null;

  @JsonProperty("year")
  private Integer year = null;

  @JsonProperty("countryId")
  private Integer countryId = null;

  public Filter genreId(Integer genreId) {
    this.genreId = genreId;
    return this;
  }

实现接口

@Override
    public ResponseEntity<SelectionTo> findFilms(Filter filterType) {
        //here filter is null !
        return ResponseEntity.ok(transformer.transform(service.getItemsInfo()));
    }

请求

http://localhost/films?filter[genreId]=13&filter[year]=2021

如何改进 openapi 文件?因为这是我唯一定义的。或者还有什么原因?

【问题讨论】:

    标签: java spring rest query-parameters openapi


    【解决方案1】:

    据我所知,Spring MVC 不支持解码 OpenAPI deepObject 样式的嵌套对象查询参数,例如 filter[genreId]=13,至少开箱即用。

    【讨论】:

    • 是的,据我所知,这是真的,在这个意义上不支持 deepObject,我们使用那个时间查询命名“filter[genreId]=”所以它不是很酷但足够我们的目的)感谢您的回复)
    【解决方案2】:

    尝试从过滤器对象中删除@RequestParam()

    像这样:

    default ResponseEntity<SelectionTo> _findFilms(@ApiParam() @Valid Filter filter) {
        return findFilms(filter);
    }
    

    请求也应该是http://localhost/films?genreId=13&year=2021

    【讨论】:

    • "同样请求应该是localhost/films?genreId=13&year=2021" - 不,deepObject 对应于?filter[genreId]=13&amp;filter[year]=2021
    • @Helen 那你有什么建议?
    • 谢谢!尽管查询中的这些参数以这种方式是可取的 filter[genreId]=1&filter[year]=2000&filter[somewhat]=val 和 @RequestParam(...) - 生成,但我对每次都删除它不是很感兴趣。是否有可能调整 openapi 以生成没有该注释的代码?
    猜你喜欢
    • 2021-06-28
    • 2018-05-08
    • 1970-01-01
    • 2013-03-05
    • 2019-12-24
    • 2017-02-24
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    相关资源
    最近更新 更多