Как отправить форму с помощью Джерси 2.0

Я пытаюсь получить некоторые данные из формы с трикотажем, и хотя это было бы легкой задачей, но я получаю сообщение об ошибке, когда пытаюсь что-то сделать POST.

Caused by: java.lang.IllegalStateException: The @FormParam is utilized when the content type of the request entity is not application/x-www-form-urlencoded
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.ensureValidRequest(FormParamValueFactoryProvider.java:126)
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.getForm(FormParamValueFactoryProvider.java:111)
at org.glassfish.jersey.server.internal.inject.FormParamValueFactoryProvider$FormParamValueFactory.get(FormParamValueFactoryProvider.java:94)
at org.glassfish.jersey.server.internal.inject.AbstractHttpContextValueFactory.provide(AbstractHttpContextValueFactory.java:65)
at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:80)
... 36 more

Я думаю, что это важная часть трассировки стека. Теперь для кода, который я использую:

@POST
@Path("/delete")
@Produces("application/json")
public String delete(@FormParam("id")String id){

И я пытаюсь выполнить POST с помощью тестовой html-страницы, например:

<form action="<path to the server>/delete" method="post">
    primary_id: <input type="text" name="primary_id" /><br />
    <input type="submit" value="Submit" />
</form>

Я пытался заставить его работать, но никаких шансов. Я попытался добавить аннотацию @Consumes() с помощью multipart-form-data, но не могу заставить ее работать. Надеюсь, кто-то может дать мне руку.

Ответ 1

Спасибо всем за помощь. С некоторым обзором кода я нашел проблему. Несмотря на то, что я не думаю, что кто-то другой сделает эту конкретную ошибку, я все равно отправлю ее для будущей справки.

Проблема заключалась в том, что я не использую стандартный веб-сервер. Я реализовал netty сервер с Джерси, и проблема была в этой реализации. Проблема заключалась в том, что я не передавал заголовки в HTTP-запросе на Джерси, как должен. Я потерял Content-Type в середине операции, это означает, что Джерси не смог идентифицировать тип сообщения.

Итак, для справок в будущем, для тех, у кого есть аналогичная проблема при попытке реализовать нестандартный сервер с использованием трикотажа: когда вы не проходите медиа-тип правильно (в классе ContentRequest есть метод, называемый getMediaType() который используется, среди прочего, для проверки содержимого-типа, когда используется @FormParam), вы получите этот тип исключения.

Еще раз спасибо вам за помощь:)

Ответ 2

Ваш код работает нормально, за исключением того, что вам нужно изменить

<input type="text" name="id" />

Поскольку вы havent define @Consumes(), по умолчанию метод delete потребляет mediaType="application/x-www-form-urlencoded" .

Я проверил ваш код, и он отлично работает здесь. Мое предложение - проверить ваши файлы jersey jar. Специально файл jsersey-server.jar в вашей папке lib.

Ответ 3

Вы вводите свой ввод как "primary_id", но вы получаете имя "id" в аннотации @FormParm. Измените идентификатор и имя в своем теге ввода на "id".

Также, если вы используете приложение /x -www-form-urlencoded, добавьте этот атрибут в свой тег формы: enctype = "application/x-www-form-urlencoded"