POST на службу службы REST службы Джерси 415 Неподдерживаемый тип носителя
Я использую веб-приложение JAX-RS с Джерси и Tomcat. Получить запросы в порядке, однако, когда я пытаюсь опубликовать JSON, я получаю статус HTTP 415 – Unsupported Media Type.
Вот мой простой HelloWorld.java:
package service; import javax.ws.rs.*; @Path("hello") public class HelloWorld { @GET @Produces("text/plain") public String get() { return "hello world"; } @POST @Consumes("application/json") public String post(JS input) { return input.hello; } public static class JS { public String hello; } }
Вот запрос, который я пытаюсь использовать в Postman (с заголовком «application / json»):
- JAX-RS Сообщение нескольких объектов
- REST API - Массовое создание или обновление в одном запросе
- Отключить язык приложений гипертекста (HAL) в JSON?
- Как работает аннотация «Spring @ResponseBody» в этом примере приложения RESTful?
- Как создать новую страницу в Confluence с помощью REST API?
Вот макет проекта с библиотеками:
Я использую:
- Java 7 x64
- Джерси 2.17
- Tomcat 7.0.62 x64
Благодаря!
Распределение Джерси не поставляется с поддержкой JSON / POJO. Вам нужно добавить зависимости / банки.
Добавьте все эти
- Джерси-медиа-JSON-ДЖЕКСОН-2,17
- ДЖЕКСОН-jaxrs-JSON-провайдер 2.3.2
- ДЖЕКСОН-kernel-2.3.2
- ДЖЕКСОН-DataBind-2.3.2
- ДЖЕКСОН-аннотаций-2.3.2
- ДЖЕКСОН-jaxrs основание 2.3.2
- ДЖЕКСОН-модуль-JAXB-аннотаций-2.3.2
- джерси-сущность-фильтрация-2,17
С Maven ниже подтяните все вышеперечисленное в
org.glassfish.jersey.media jersey-media-json-jackson 2.17
Для любых будущих читателей, не использующих Jersey 2.17 (и используя банки непосредственно вместо Maven), вы можете пойти здесь, чтобы найти версию, которую вы используете, и посмотреть, какие транзитивные версии зависимостей вам нужны. Текущая версия этой зависимости от Джерси использует Jackson 2.3.2. Это главное, что нужно искать.
Проверьте свой тип контента REST. Он должен быть contentType: ‘application / json’, если вы передаете json-данные classу POJO.
Прошли многие ответы как на этой странице, так и на других, но безрезультатно. Это действительно сработало для меня:
МЕТОД 1: Вместо передачи JSONObject
качестве параметра ресурсного метода достаточно передать String
. Возьмите String
и создайте JSONObject
с ней, а затем вы можете использовать ее в своем коде. Вот так,
@Path("/people") @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response doGetperson(String jsonRequest) { try { JSONObject requestedJSON = new JSONObject(jsonRequest); //So now you can use requestedJSON object created to do your stuff return Response.ok("{\"name\":" + requestedJSON.getString("user") + "}").build(); } catch (Exception ex) { return Response.ok("{ \"name\":\"\"}").build(); } }
СПОСОБ 2:
Добавление этой зависимости по состоянию на сентябрь 2017 года :
org.glassfish.jersey.media jersey-media-moxy 2.26
Ссылка здесь
Я думаю, что вы отправляете запрос, работает правильно, но ваш браузер / почтальон не может разобрать ответ, полученный от службы. Он возвращает обычный текст, и почтальон ждет json. Добавьте Produce аннотацию к вашему веб-сервису и установите его в json. Я также предлагаю вам проверить с помощью Fiddler2, чтобы увидеть точную информацию, проходящую через провод.