0

Не удалось найти писателя тела сообщения для класса Java

12

Я новичок в использовании 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 ответ(ов)

1

Я, наконец, нашел решение своей проблемы. Я добавил следующий фрагмент в файл 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>

После этих изменений всё стало работать как надо. При этом никаких изменений в моем коде не потребовалось.

0

Я добавил следующие 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

Попробуйте сделать то же самое!

0

Небольшое дополнение. Если вы не используете файл дескриптора 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);
...

Это позволит вам настроить необходимые свойства без использования внешнего файла конфигурации.

0

Пользователь 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-выхода включена по умолчанию, поэтому дополнительная зависимость для неё не нужна.

0

У меня была такая же проблема: "Не найден писатель тела сообщения для 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. Важно, чтобы все компоненты проекта использовали совместимые версии библиотек, чтобы избежать конфликтов.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь