Как отправить форму с помощью Джерси 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"