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

Джерси: писатель тела сообщения для Java-класса и MIME-приложения/json не был найден

пытаясь выяснить, в чем моя проблема, я, наконец, решил спросить вас, как решить мою проблему. Я видел разных людей с той же проблемой, и я пробовал все, что им посоветовали, но ничего не помогло с моей проблемой. Поэтому в основном у меня есть служба RESTful, которую я создаю с использованием Джерси. Для моего клиента я хотел бы вернуть объект в формате JSON. Я прочитал различные учебники и решил, что имеет смысл использовать библиотеку jersey-json-1.8. Я добавил все в свой проект, как обычно, и попытался запустить его, но каждый раз, когда я звоню в службу (через get request atm.), Я получаю HTTP-код ошибки 500 (внутренняя ошибка сервера), и мой сервер отвечает, что нет тела сообщения писателя можно найти. Если я возвращаю XML, он работает отлично, и все отлично. Я также попытался скопировать jersey-json-1.8.jar в папку Tomcat lib, потому что мне пришлось делать это с помощью mysql lib, который я использую, но это тоже не помогло. Я был бы очень рад, если бы вы помогли мне заставить это работать! Если вам нужна дополнительная информация, просто оставьте комментарий, и я предоставлю его так же быстро, как по-человечески:)

Моя настройка проекта: 3 разных пакета 1. Мои RESTfulServices 2. Моя работа Java, где я обрабатываю SQL-соединения и т.д. 3. Пакет, в котором хранятся все мои модели, с которыми мне нужно работать, и что я хочу вернуться в формате JSON (в моем примере - маршрут для тестового диска)

Веб-сервер Tomcat IDE: Eclipse Я использую Maven

Независимо от того, что или как я пытаюсь вернуть объект, он просто не будет работать, и я постоянно получаю сообщение об ошибке:

Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.mykong.models.Teststrecke, and Java type class com.mykong.models.Teststrecke, and MIME media type application/json was not found

EDIT: Здесь мой метод обслуживания JSON

@Path("/hellojson")
public class JSONService {


    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public ArrayList<Route> getJSONMsg()  
    {

        Route ts = new Route();
        ts.setId(1);
        ts.setName("HelloWorld");


        Route ts2 = new Route();
        ts2.setId(2);
        ts2.setName("HelloWorld");


        ArrayList<Route> availRoutes = new ArrayList<Route>();
        availRoutes.add(ts);
        availRoutes.add(ts2);


        return availRoutes;


    }
}
4b9b3361

Ответ 1

Попробуйте добавить библиотеку Genson к вашему пути к классам http://owlike.github.io/genson/. Это json < > java потоковая передача и привязка данных api. Он хорошо интегрируется с трикотажем, чтобы заставить вас работать, вам нужна конфигурация 0. Джерси обнаруживает, что библиотека находится в вашем пути к классам и позволяет отображать json, делегируя Genson.

Ответ 2

Включите эти зависимости в свой POM.xml и запустите Maven → Update

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-json</artifactId>
    <version>1.18.1</version>
</dependency>
<dependency>
   <groupId>com.owlike</groupId>
   <artifactId>genson</artifactId>
   <version>0.99</version>
</dependency>

Ответ 3

Добавление ниже зависимостей решило мою проблему. В соответствии с @eugen я попытался добавить зависимость Genson, которая помогла избавиться от исключения, однако по какой-то причине мой сервер выбрасывал 400 плохих запросов. Кажется, что Genson не смог правильно передать запрос json. Но ниже зависимость работала нормально. Надеюсь, это помогает другим, так как эта проблема сводит меня с ума!

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>2.3.0</version>
</dependency>

Ответ 4

Перемещение jersey-json зависимости от вершины pom.xml решило эту проблему для меня.

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

  <!-- other dependencies -->

</dependencies>

Ответ 5

Проверьте в Maven Dependencies в обозревателе пакетов, если вы не видите этого или jersey-bundle-1.8.jar, то вы, вероятно, указали только джерси-сервер. Измените зависимость в pom.xml на jersey-bundle, и он должен работать.

Ответ 6

Джерси 2.4: Я тоже столкнулся с этой проблемой и опубликовал это выражение, это помогает кому-то. Я выбрал это из спецификации API Джерси для интеграции JSON: (https://jersey.java.net/documentation/latest/user-guide.html#json)

Я использовал Jettison для интеграции с Джерси с JSON. Но даже после добавления всех библиотек я получил сообщение об ошибке: писатель тела сообщения для Java Class и MIME application/json не был найден

Все о добавлении правильных библиотек, а также регистрации функций > Я добавил еще одну дополнительную библиотеку в дополнение ко всем остальным, которые предоставляет Джерси: jersey-media-json-jettison-2.4.jar. И добавил код ниже для регистрации функции Jettison.

   public class MyApplication extends ResourceConfig{
      public MyApplication() {
          register(JettisonFeature.class);
          packages("org.XXX.XXX.XXX");   
    }

Ответ 7

Удалить @Produces (MediaType.APPLICATION_JSON); и использовать JSONLibraries.zip файл для преобразования ваших данных в JSON и из него. Он работает отлично. Проблема с приведенным выше кодом заключается в том, что он использует комбинацию maven и and jackson. Поэтому APPLICATION_JSON не может быть найден, если вы используете только трикотаж. Я работал с/с JSON конверсионным материалом, он дал мне ту же ошибку, я попытался с этим решением, и он работал нормально.

код:

@Path("/hellojson")
public class JSONService {

    @GET
    public ArrayList<Route> getJSONMsg()  
    {

        Route ts = new Route();
        ts.setId(1);
        ts.setName("HelloWorld");

        Route ts2 = new Route();
        ts2.setId(2);
        ts2.setName("HelloWorld");

        ArrayList<Route> availRoutes = new ArrayList<Route>();
        availRoutes.add(ts);
        availRoutes.add(ts2);

        return JSONObject.fromObject(availRoutes.toString()));
    }
}

Ответ 8

Этот вопрос был задан некоторое время назад, но для тех, кто читает, обратите внимание, что в контейнере сервлетов Джерси есть собственный картограф POJO.

Включите его, добавив следующее в ваш web.xml

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

Я заметил некоторые несоответствия в том, как объекты карты Джерси и Генсона. Например, если класс имеет поле типа A, которое задано экземпляром B, который расширяет A, genson не будет правильно сериализовать B, в то время как jersey делает.

Ответ 9

Вышеуказанная проблема будет решена с помощью библиотеки Джексона вместо Дженсона.

    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.0</version>
    </dependency>


    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.2</version>
    </dependency>

    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.25</version>
    </dependency>

Как и в моем случае, genson давал пустой json в ответе, но все будет хорошо, если мы конвертируем json в string. Но создаст нежелательный вывод, потому что в ответе вы получите строку, а не json. Так что лучше пойти с библиотекой Джексона, которая сделает это очень легко.

Примечание: Джексон преобразует ваш ответ в json только в том случае, если класс реализует интерфейс Serializable. Так что, если вы отправляете JSONObject, лучше отправлять список JSONObject.