Почему JAX-RS POST не работает с многозначной картой - PullRequest
0 голосов
/ 19 октября 2018

У меня JAX-RS 2.8.9 с приложением Spring 4.3.4.Я выполняю очень простой запрос POST к следующему коду сервера

@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(MultivaluedMap<String, String> work) {
    return Response.ok(work.keySet().size()).build();
}

Я тестирую с помощью curl:

 curl -i -X POST 'http://localhost:XXX/some/test' -d "param=value&param2=value2" -H "Content-Type: application/x-www-form-urlencoded"

Я получаю следующее предупреждение

Aзапрос сервлета к URI http://localhost:XXX/some/test содержит параметры формы в теле запроса, но тело запроса было использовано сервлетом или фильтром сервлета, обращающихся к параметрам запроса.Только методы ресурсов, использующие @FormParam, будут работать как положено.Ресурсные методы, использующие тело запроса другими средствами, не будут работать должным образом.

О которых я обнаружил только причину, связанную с проблемами подключения, по-видимому, у меня нет.

Согласно документация это способ обработки случая, когда передается переменное число FormParams.

Это работает, хотя.

@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(@FormParam("param") String param) {
    return Response.ok(param).build();
}

В чем может быть причина, почему многозначная карта не делает?Это может быть какая-то фильтрация?Что является альтернативой для неизвестного числа параметров?

ОБНОВЛЕНИЕ Это связано с особенностью Джерси + Спринг.Решение можно найти в этом ответе.

1 Ответ

0 голосов
/ 19 октября 2018

Что может быть причиной того, что многозначная карта не делает?Это может быть какая-то фильтрация?Что является альтернативой для неизвестного числа параметров?

По умолчанию кажется, что ваша реализация JAX-RS обнаруживает ввод формы и читает / обрабатывает тело, прежде чем оно попадет в ваш метод.Вы пробовали:

@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(Form workForm) {
    MultivaluedMap<String,String> work = workForm.asMap();
    return Response.ok(work.keySet().size()).build();
}

?

Form - это специальный класс JAX-RS, который инкапсулирует все параметры формы и должен использоваться в качестве входного параметра для вашего метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...