POST на службу службы REST службы Джерси 415 Неподдерживаемый тип носителя
Я использую веб-приложение JAX-RS с Джерси и Tomcat. Получить запросы в порядке, однако, когда я пытаюсь опубликовать JSON, я получаю статус HTTP 415 - Неподдерживаемый тип носителя.
Вот мой простой 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'):
Вот макет проекта с библиотеками:
![enter image description here]()
Я использую:
- Java 7 x64
- Джерси 2.17
- Tomcat 7.0.62 x64
Спасибо!
Ответы
Ответ 1
Распределение Джерси не поставляется с поддержкой JSON/POJO. Вам нужно добавить зависимости/банки.
Добавьте все эти
С Maven, ниже вытащите все вышеперечисленное в
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.17</version>
</dependency>
Для любых будущих читателей, не использующих Jersey 2.17 (и используя jars непосредственно вместо Maven), вы можете пойти здесь, чтобы найти версию, которую вы используете, и посмотреть какие транзитивные версии зависимостей вам нужны. Текущая версия этой зависимости от Джерси использует Jackson 2.3.2. Это главное, что нужно искать.
Ответ 2
Проверьте свой тип содержимого запроса REST. Должен быть
contentType: 'application/json', если вы передаете json-данные классу POJO.
Ответ 3
Я думаю, что вы отправляете запрос, работает правильно, но ваш браузер/почтальон не может разобрать ответ, полученный от службы. Он возвращает обычный текст, и почтальон ждет json. Добавьте Produce аннотацию к вашему веб-сервису и установите его в json. Я также предлагаю вам проверить с помощью Fiddler2, чтобы увидеть точную информацию, проходящую через провод.
Ответ 4
Прошло много ответов как на этой странице, так и на других, но безрезультатно.
Это действительно сработало для меня:
МЕТОД 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 года:
<!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-moxy -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
<version>2.26</version>
</dependency>
Ссылка здесь