Я пытаюсь реализовать метод в ресурсе dropwizard, который будет обслуживать вызов из интерфейса JS (который использует DataTables).Список десериализации <Map <String, String >> QueryParam in jersey 1
Запрос содержит параметры запроса, которые выглядят следующим образом:
колонки [0] [данные] = 0 & колонки [0] [имя] = & столбцы [0] [поиск] = ложные & столбцы [0] [упорядочиваема] = FALSE & столбцов [0] [поиск] [значение] = & столбцы [0] [поиск] [регулярное выражение] = FALSE
колонны [1] [Data] = ИАТА & столбцы [1 ] [name] = iata & столбцы [1] [поиск] = истинные & столбцы [1] [упорядочиваемый] = истинный & столбцов [1] [Поиск] [значение] = & столбцов [1] [поиск] [регулярное выражение] = FALSE
запрос приходит из интерфейса JS реализованный с DataTables, и использует обработку на сторону сервера. Информация о том, как DataTables посылает запросы здесь:
https://datatables.net/manual/server-side
У меня возникли проблемы, определяющие тип данных для указанных выше параметров запроса. С весенними данными, мы можем определить его как:
List<Map<String, String>> columns
, которые могут быть обернуты в объект с аннотацией ModelAttribute и будет десериализации хорошо.
В моем приложении я использую более старую версию dropwizard, которая зависит от трикотажа 1.19. Я пробовал аннотировать его как QueryParam, но приложение не работает при запуске.
Метод:
@Path("/mappings")
@GET
@Timed
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public Response getMappings(@QueryParam("columns") List<Map<String, String>> columns) {
// processing here.
}
Когда я делаю это, я получаю:
ERROR [2016-11-07 14: 16: 13061] com.sun.jersey.spi.inject. Ошибки: следующие ошибки и предупреждения были обнаружены с помощью ресурсов и/или классов поставщиков: SEVERE: Отсутствует зависимость для метода public javax.ws.rs.core.Response com.ean.gds.proxy.ams.application. resource.gui.IataMappingGuiResource.getMappings (java.util.List) по параметру с индексом 0 WARN [2016-11-07 14: 16: 13070] /: недоступен
Мой вопрос: у меня есть какой-либо другой вариант, кроме написания пользовательского десериализатор для него?
Примечание: если я получаю запрос с помощью @Context, я вижу, что decodedQueryParams являются многозначными картами, которые сопоставляют строковые ключи, такие как «столбцы [0] [данные]», в списки значений String, которые всегда имеют один элемент, то есть значение.
Обновление: После некоторого рытья я нашел следующую спецификацию JAX-RS (раздел 3.2), который объясняет, почему мой подход не является действительным, чтобы начать с:
следующие типы:
Примитивные Типы
типов, которые имеют конструктор, который принимает один Строковый аргумент.
Типы, которые имеют статический метод с именем valueOf с одним аргументом String.
List, Set или SortedSet, где T удовлетворяет 2 или 3 выше.
Источник: Handling Multiple Query Parameters in Jersey
Так что я попытался использовать только список вместо. Это не приводит к сбою приложения при запуске, но когда запрос приходит, он десериализуется в пустой список. Поэтому остается вопрос, какой подход правильный.
Это то, что вам нужно будет разобрать вручную. Или найдите библиотеку, которая знает, как ее разобрать. Джерси недостаточно умен для этого –
Не позволяет ли эта клиентская библиотека отправлять данные в формате JSON? Если вам нужно придерживаться параметров запроса, а не отправлять его в тело, вы все равно можете более легко разбирать JSON, тогда вы сможете сделать этот текущий формат. Я знаю, что большинство JS-библиотек позволяют использовать формат JSON –
@peeskillet К сожалению, это не так. Я не могу контролировать, как библиотека отправляет эти данные в запросе. В настоящее время я собираюсь создать собственный парсер. Благодаря ! –