Исключение на Джерси: SEVERE: программа чтения сообщений для класса Java - PullRequest
34 голосов
/ 21 декабря 2011

У меня есть Rest WS на основе Джерси, который выводит JSON.Я внедряю клиент Jersey для вызова 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);

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

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.Мой POJO был аннотирован XMLRootElement.Чего мне не хватает

Спасибо

Ответы [ 13 ]

29 голосов
/ 21 декабря 2011

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

26 голосов
/ 22 июля 2013

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

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

    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-json</artifactId>
        <version>1.17.1</version>
    </dependency>
    
10 голосов
/ 08 мая 2013

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

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

@XmlRootElement(name = "someName")
10 голосов
/ 01 августа 2012

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

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>
8 голосов
/ 22 апреля 2015

Если вы создаете uberjar или «затененную банку», убедитесь, что файлы службы метаинформации объединены.(Этот бит меня несколько раз затрагивал в проекте dropwizard.)

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

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

4 голосов
/ 29 апреля 2015

Мы также решили использовать майку в качестве решения.Но так как мы используем 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;
3 голосов
/ 27 декабря 2016

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

 /**
 * @author manoj.kumar
 * @email kumarmanoj.mtech@gmail.com
 */
 @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!!!
3 голосов
/ 20 марта 2013

В моем случае я использую POJO. И я забыл настроить POJOMappingFeature как true. Мэйкон указал на это в раннем ответе. Однако у некоторых ребят могут возникнуть проблемы с правильной настройкой в ​​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>
2 голосов
/ 25 января 2017

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

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

0 голосов
/ 02 апреля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...