Подтвердить что ты не робот

Jersey Exception: SEVERE: читатель тела сообщения для класса Java

У меня есть основанный на Джерси Rest WS, который выводит JSON. Я осуществляю Джерси-клиент, чтобы вызывать WS и потреблять ответ JSON. Код клиента у меня ниже

WebResource r = restClient.resource(UriBuilder.fromUri("http://localhost/").port(8080).build());
String resp = r.path("/user").accept(MediaType.APPLICATION_JSON).get(String.class);
User[] users = r.path("/user").accept(MediaType.APPLICATION_JSON).get(User[].class);

Вторая строка выводит корректный ответ строки JSON, однако 3-я строка для маршалирования JSON для POJO не происходит, и я получаю следующее исключение stacktrace

SEVERE: A message body reader for Java class [Lorg.shoppingsite.model.entity.jpa.User;, and Java type class [Lorg.shoppingsite.model.entity.jpa.User;, and MIME media type application/json was not found
Dec 21, 2011 11:32:01 AM com.sun.jersey.api.client.ClientResponse getEntity
SEVERE: The registered message body readers compatible with the MIME media type are:
*/* ->
  com.sun.jersey.core.impl.provider.entity.FormProvider
  com.sun.jersey.core.impl.provider.entity.StringProvider
  com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
  com.sun.jersey.core.impl.provider.entity.FileProvider
  com.sun.jersey.core.impl.provider.entity.InputStreamProvider
  com.sun.jersey.core.impl.provider.entity.DataSourceProvider
  com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
  com.sun.jersey.core.impl.provider.entity.ReaderProvider
  com.sun.jersey.core.impl.provider.entity.DocumentProvider
  com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
  com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
  com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
  com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
  com.sun.jersey.core.impl.provider.entity.EntityHolderReader

У меня есть правильный MIME TYPES в моем запросе. Мой POJO был аннотирован XMLRootElement. Что мне не хватает.

Спасибо

4b9b3361

Ответ 1

Я смог исправить проблему, добавив зависимость maven от jersey-json.

Ответ 2

Чтобы он работал, вам нужно всего две вещи. Проверьте, не хватает ли вы:

  • Прежде всего вам потребуется @XmlRootElement аннотация для вашего класса объекта/объекта.
  • Вам нужно добавить зависимость для jersey-json, если вам не хватает. Для вашей справки я добавил эту зависимость в свой pom.xml.

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

Ответ 3

Я знаю, что этот пост старый, и вы давно это поняли, но просто чтобы спасти людей, которые прочтут это некоторое время.

Вероятно, вы забыли добавить аннотацию к сущности, которую вы передаете в конечную точку, поэтому Джерси не знает, как обрабатывать POJO, который он получает. Аннотируйте pojo примерно следующим образом:

@XmlRootElement(name = "someName")

Ответ 4

просто поставьте это

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

Ответ 5

Если вы создаете uberjar, убедитесь, что ваши метафайлы meta inf объединены. (Это бит меня несколько раз в проекте dropwizard.)

Если вы используете плагин gradle shadowJar, вы должны вызвать mergeServiceFiles() в своем целевом shadowJar: https://github.com/johnrengelman/shadow#merging-service-files

Не знаете, что аналогичные команды для maven или других систем сборки.

Ответ 6

Мы также решили использовать трикотаж в качестве решения. Но поскольку мы используем org.JSON в большинстве случаев, эта зависимость не нужна, и мы чувствовали себя не очень хорошо.

Поэтому мы использовали представление String для получения объекта org.JSON вместо

JSONObject output = response.getEntity(JSONObject.class); 

мы используем его следующим образом:

JSONObject output = new JSONObject(response.getEntity(String.class)); 

где JSONObject поступает из org.JSON, и импорт может быть изменен с:

-import org.codehaus.jettison.json.JSONArray;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;

Ответ 7

В моем случае я использую POJO. И я забыл настроить POJOMappingFeature как истину. Майкон указал на это в раннем ответе. Однако некоторым парням может быть сложно правильно настроить его в web.xml, вот мой пример.

<servlet>
    <servlet-name>Jersey Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Ответ 8

Просто добавьте ниже строки в POJO перед началом класса, и ваша проблема будет решена.    @Produces ( "Применение/JSON" )    @XmlRootElement    См. Пример    импортировать javax.ws.rs.Produces;    import javax.xml.bind.annotation.XmlRootElement;

 /**
 * @author manoj.kumar
 * @email [email protected]
 */
 @Produces("application/json")
 @XmlRootElement  
 public class User {

 private String username;
 private String password;
 private String email;
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
     this.username = username;
 }
 public String getPassword() {
     return password;
 }
 public void setPassword(String password) {
     this.password = password;
 }
 public String getEmail() {
    return email;
 }
 public void setEmail(String email) {
    this.email = email;
 }

}
add below lines inside of your web.xml
<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>  
Now recompile your webservice everything would work!!!

Ответ 9

Попробуйте добавить:

<dependency>
    <groupId>com.owlike</groupId>
    <artifactId>genson</artifactId>
    <version>1.4</version>
</dependency>

Также эта проблема может возникнуть, если вы используете HTTP GET с телом сообщения, поэтому в этом случае добавление jersey-json lib, @XmlRootElement или изменение web.xml не поможет. Вы должны использовать URL QueryParam или HTTP POST.

Ответ 10

Вам нужно реализовать свои собственные MessageBodyReader и MessageBodyWriter для вашего класса Lorg.shoppingsite.model.entity.jpa.User.

package javax.ws.rs.ext;

import java.io.IOException;
import java.io.InputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

public interface MessageBodyReader<T extends Object> {

    public boolean isReadable(Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public T readFrom(Class<T> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType, 
        MultivaluedMap<String, String> httpHeaders, 
        InputStream entityStream) throws IOException, WebApplicationException;
}

package javax.ws.rs.ext;

import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;

public interface MessageBodyWriter<T extends Object> {

    public boolean isWriteable(Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public long getSize(T t, 
        Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType);

    public void writeTo(T t, 
        Class<?> type, 
        Type genericType, 
        Annotation[] annotations, 
        MediaType mediaType, 
        MultivaluedMap<String, Object> httpHeaders, 
        OutputStream entityStream) throws IOException, WebApplicationException;
}

Ответ 11

Просто проверьте, выполняете ли вы разные экземпляры в eclipse. Я оставил все мои другие сеансы, чистая сборка исправила проблему.

Ответ 12

Некоторые могут быть смущены, почему добавление jersey-json jar не может решить эту проблему. Я узнал, что эта банка должна быть более новой, чем jersey-json-1.7.jar(1.7.0 не работает, но 1.7.1 отлично работает). надеюсь, что это поможет

Ответ 13

Шахта была похожей ситуации. Я получаю эту ошибку в критические моменты, и я не помнил, как я ее решил раньше, что я делал много раз. После напряженных часов осмотра я решил и воспроизвел ошибку и убедился, насколько простым является решение этой ситуации.

Хорошо - решение: удалить (или исправить) все внесенные изменения в ваши основные файлы свойств проекта.

Да, это он. Фактически, мой проект является многомодульным, и вы знаете, что без правильных зависимостей это редкий случайный сценарий, который часто выбирается из git (RAC тоже). Мой проект получал почти все настраиваемые вещи из файла свойств, который является общим для примерно 15 модулей (подпроектов) с хорошим количеством внутризависимых связей между ними. jersey-json зависимость всегда присутствует в моем объединенном родительском pom. XML-аннотации не являются проблемой, так как проект выполняется примерно 100 раз после их модификации. некоторые решения здесь указывают на web.xml и такие вещи, как POJOMappingFeature. В моем случае я даже не коснулся модуля webapp в этой сборке. так или иначе, это решение сработало для меня, и я трачу время, чтобы записать это в SO, если я когда-нибудь попаду в эту ошибку, мне не придется терять сонливые ночи. (конечно, для вас тоже)