Писатель тела сообщения для класса Java не найден - программирование
Подтвердить что ты не робот

Писатель тела сообщения для класса 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

Что я делаю неправильно?

4b9b3361

Ответ 1

Наконец-то я нашел свой ответ. Я добавил

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.8</version>
</dependency>

в файл pom.xml. Затем я добавил

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

в мой файл web.xml, и все работает нормально. Для моего кода не было изменений.

Ответ 2

Я добавил следующие банки, и это сработало для меня

  • ДЖЕКСОНА-ядро-ASL-1.9.2.jar
  • ДЖЕКСОНА-картографа-ASL-1.9.2.jar
  • ДЖЕКСОНА-хс-1.9.2.jar
  • ДЖЕКСОНА-jaxrs-1.9.2.jar

Ответ 3

Просто небольшое дополнение. Если вы не используете файл дескриптора web.xml, вы можете включить POJOMappingFeatire программно, как показано ниже.

...
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);
...

Ответ 4

Пользователь Maven: вам нужны только две зависимости.

<!-- For Jersey --> 
<dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet-core</artifactId>
        <version>2.15</version>
</dependency>

<!-- For JSON --> 
<dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.15</version>    
</dependency>

Выход XML поддерживается по умолчанию. Поэтому для этого не требуется никакой зависимости.

Ответ 5

Работая с Jersey 1.8, я получал ту же ошибку при создании объекта JSON и ударил API REST с клиентской стороны.

Если вы столкнулись с проблемой на стороне сервера, убедитесь, что вы правильно включили jersey-json.jar в classpath и сопоставили правильный init-param в web.xml, как упоминалось в других ответах.

Для клиентской стороны

В соответствии с документацией Jersey 1.8 следующий фрагмент показывает, как использовать функцию сопоставления POJO JSON на стороне клиента:

 ClientConfig clientConfig = new DefaultClientConfig();
 clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING,Boolean.TRUE);
 Client client = Client.create(clientConfig);

Ответ 6

У меня была такая же проблема:  Писатель тела сообщения для типа 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>

Ответ 7

У меня была та же проблема, но моя ошибка заключалась в том, что я импортировал неправильную библиотеку с именем javax.websocket.sever для аннотации PathParam в классе REST. Я надеюсь, что это поможет вам