Не удалось найти писателя тела сообщения для класса Java
Я новичок в использовании JAX-RS и написал простое приложение, которое выводит JSON-объект. Но я получаю исключение. Вот мой код:
@Path("/hello")
public class HelloWorldService {
@GET
@Path("/query/{artist_id}")
@Produces("application/json")
public Data getMsg(@PathParam("artist_id") int artist_id,
@QueryParam("from") int from,
@QueryParam("to") int to) {
Data d = new Data();
d.setName("Mateen");
d.setRoll(77);
return d;
}
}
Мой класс данных — это простая POJO:
@XmlRootElement
public class Data {
private int roll;
private String name;
public int getRoll() {
return roll;
}
public void setRoll(int roll) {
this.roll = roll;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Тем не менее, я получаю исключение:
javax.ws.rs.WebApplicationException:
com.sun.jersey.api.MessageException:
A message body writer for Java class com.abc.data.Data,
and Java type class com.abc.data.Data,
and MIME media type application/json was not found
Что я делаю не так?
5 ответ(ов)
Я, наконец, нашел решение своей проблемы. Я добавил следующий фрагмент в файл pom.xml
:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-json</artifactId>
<version>1.8</version>
</dependency>
Затем я добавил следующий параметр в файл web.xml
:
<init-param>
<param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
<param-value>true</param-value>
</init-param>
После этих изменений всё стало работать как надо. При этом никаких изменений в моем коде не потребовалось.
Я добавил следующие JAR-файлы, и это сработало для меня:
- jackson-core-asl-1.9.2.jar
- jackson-mapper-asl-1.9.2.jar
- jackson-xc-1.9.2.jar
- jackson-jaxrs-1.9.2.jar
Попробуйте сделать то же самое!
Небольшое дополнение. Если вы не используете файл дескриптора web.xml, вы можете включить функцию POJOMappingFeature программно, как показано ниже:
...
final ResourceConfig rc = new PackagesResourceConfig("com.test.resources");
final Map<String, Object> config = new HashMap<String, Object>();
config.put("com.sun.jersey.api.json.POJOMappingFeature", true);
rc.setPropertiesAndFeatures(config);
...
Это позволит вам настроить необходимые свойства без использования внешнего файла конфигурации.
Пользователь Maven: Вам просто нужны следующие 2 зависимости.
<!-- Для Jersey -->
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.15</version>
</dependency>
<!-- Для JSON -->
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.15</version>
</dependency>
Поддержка XML-выхода включена по умолчанию, поэтому дополнительная зависимость для неё не нужна.
У меня была такая же проблема: "Не найден писатель тела сообщения для Java типа, класс java.lang.String, и MIME медиа-типа, application/json".
Проблема заключалась в том, что класс javax.ws.rs.ext.MessageBodyWriter
из библиотеки:
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.22.2</version>
</dependency>
конфликтовал с тем же классом из библиотеки:
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-client</artifactId>
<version>1.19.1</version>
</dependency>
Чтобы решить эту проблему, рекомендуется использовать только одну версию Jersey во всем проекте. Либо перейдите на более новую версию Jersey 2.x и удалите зависимости, относящиеся к старой версии 1.x, либо наоборот, если у вас есть зависимости, которые требуют именно Jersey 1.x. Важно, чтобы все компоненты проекта использовали совместимые версии библиотек, чтобы избежать конфликтов.
Как закодировать значения параметров URI?
Передача нескольких параметров в REST API - Spring
Что значит 'synchronized'?
Как объявить массив в одну строку?
Какие проблемы следует учитывать при переопределении equals и hashCode в Java?