Jersey JAX-RS и OpenaAPI deepObject = настоящая проблема десериализации - PullRequest
0 голосов
/ 07 мая 2020

У нас проблемы с десериализацией параметра запроса с использованием квадратных скобок (?paging[offset]=3) в Джерси.

Мы используем Jersey JAX-RS и аннотируем наши конечные точки и bean-компоненты с помощью swagger OpenAPI и инструменты для автоматического создания нашей документации. Мы хотим следовать стандарту JSON:API для описания нового API. JSON:API указывает, что для реализации разбиения по страницам API должен принимать параметр запроса в формате: ?paging[offset]=0&paging[limit]=10

Наши аннотации swagger поддерживают это из коробки, что позволяет нам указать

@Parameter(
description = "paging",
style = ParameterStyle.DEEPOBJECT,
explode = Explode.TRUE)

Что совместимо с обозначением квадратных скобок paging[offset] и т. Д. И он генерирует правильную документацию для нашего параметра paging. Все хорошо, здорово и красиво.

Проблема в JAX-RS. В JAX-RS есть аннотация @QueryParam. Но чтобы использовать сложный объект с аннотацией @QueryParam, этот тип должен иметь a constructor with a single String parameter. Нет проблем. Давайте добавим конструктор к нашему компоненту подкачки.

public class PagingBean {

  public PagingBean(String stringValue){...}

  @XmlElement
  public getOffset(){...}
  public setOffset(int offset){...}

  @XmlElement
  public getLimit(){...}
  public setLimit(int limit){....}

}

Итак, наша конечная точка теперь выглядит как

@Get("/path")
public Response someEndpoint(
  @Parameter(description = "paging",style = ParameterStyle.DEEPOBJECT,explode = Explode.TRUE) @QueryParam("paging") PagingBean paging
){
...
}

Но если мы нажмем на наш api

GET /rest/path?paging[limit]=10&paging[offset]=5

Мы видим, что параметр запроса paging равен нулю. Похоже, Джерси даже не осознал, что paging[... является частью paging QueryParam. Вероятно, что он ожидает именно ключ paging, а не ключ, подобный paging\[?.

Мы можем подтвердить это, введя @Context UriInfo ui и проверив параметры запроса. Их ключи: paging[offset] и paging[limit]

Одно из решений этого - flatten наши параметры в конечной точке, например,

@QueryParam("paging[limit]") pagingLimit,
@QueryParam("paging[offset]") pagingOffset

Но это не очень приятно смотреть на .

Идеи о том, как десериализовать это в Джерси?

...