У нас проблемы с десериализацией параметра запроса с использованием квадратных скобок (?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
Но это не очень приятно смотреть на .
Идеи о том, как десериализовать это в Джерси?