"messagebodywriter not found" при возврате list <long> с объектом response в jax-rs

В настоящее время я пытаюсь создать rest-webservice, который возвращает объект типа Список <Длинный>. Услуга аннотируется @Produces (MediaType.APPLICATION_JSON).

У меня нет проблем с другими сервисами в этом проекте.

Если я напишу код следующим образом:

List<Long> list = new ArrayList<Long>();
            list.add(100L);
            list.add(200L);
            list.add(300L);

return Response.ok(list)
               .build();

Затем в журнале появляется следующее сообщение:

MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=class java.util.ArrayList.

Если я вместо этого напишу его следующим образом (так же, как я сделал для другой службы в проекте, но где это список объектов pojo):

List<Long> list = new ArrayList<Long>();
            list.add(100L);
            list.add(200L);
            list.add(300L);

GenericEntity<List<Long>> genericEntity = new GenericEntity<List<Long>>(list){};

return Response.ok(genericEntity)
               .build();

Вместо этого я получаю следующее сообщение:

MessageBodyWriter not found for media type=application/json, type=class java.util.ArrayList, genericType=java.util.List<java.lang.Long>.

После поиска в Google я нашел следующее предложение преобразовать список в массив, как показано ниже, но это тоже не сработало.

List<Long> list = new ArrayList<Long>();
            list.add(100L);
            list.add(200L);
            list.add(300L);

            return Response.ok(list.toArray()).build();

Тогда я получаю:

MessageBodyWriter not found for media type=application/json, type=class [Ljava.lang.Object;, genericType=class [Ljava.lang.Object;.

Мы используем jackson-core версии 2.3.2, а реализация jax-rs - Jersey, которая входит в состав Weblogic 12c.

Есть ли для этого хорошее решение (без использования каких-либо других библиотек)?

Если вы используете JAX-RS и хотите вернуть результаты как List<Long>, я считаю, что вы просто возвращаете сам List<Long>, а не завернутый в Response. JAX-RS позаботится о его преобразовании в запрошенный тип.

Kevin Swan 10.08.2018 15:18

Да это правда. но я также хочу вернуть заголовок в ответном сообщении. Если есть проблема на стороне сервера, я вместо этого возвращаю сообщение об ошибке с соответствующим кодом состояния http.

eternitysharp 10.08.2018 15:29

Затем вы просто выбросите WebApplicationException, построенный с соответствующим кодом ошибки (с использованием констант кода состояния, определенных Response.Status). Позвольте JAX-RS сделать всю работу за вас.

Kevin Swan 10.08.2018 15:35

Спасибо за ваш комментарий! Кажется, сегодня я узнал что-то новое (WebApplicationException). Но мне все еще нужно иметь возможность добавлять заголовки к ответу, как правильный ответ, так и ответ об ошибке.

eternitysharp 10.08.2018 16:00

Какую структуру JAX-RS вы используете?

cdan 12.08.2018 13:23

Именно Джерси входит в Weblogic 12c.

eternitysharp 16.08.2018 09:49
0
6
1 168
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Поскольку вы создаете данные типа json, для синтаксического анализа объекта в форме json требуется связанный с ним файл jar.

Добавьте банку Джексона в свой pom.xml, если это проект Maven.

добавить эту зависимость ..

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.9.6</version>
</dependency>

Или

загрузите банку и добавьте ее в путь к классу.

Спасибо за ваш ответ! Я обновил вопрос, указав версию Джексона, которую мы используем.

eternitysharp 13.08.2018 10:47

Вы не упомянули, с какой платформой JAX-RS вы играете, но согласно Документация Apache CXF, например, если вы хотите использовать Джексона в качестве поставщика JSON, вам понадобится эта зависимость:

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

Затем зарегистрируйте одного из провайдеров Jackson в своей службе JAX-RS, я думаю, тот, который предназначен для POJO в вашем случае, а не тот, который предназначен для bean-компонентов JAXB (ВНИМАНИЕ: имя пакета в документации CXF предназначено для Jackson 1.x, я заменил его на один для Jackson 2.x):

<jaxrs:providers>
   <bean class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"/>
</jaxrs:providers>

Для Джерси это будет различная зависимость.

Спасибо за ответ! Теперь добавили, какие фреймворки я использую. Я попробовал ваше предложение, но, к сожалению, оно не помогло. Я не думаю, что это проблема, поскольку Джексон, кажется, работает во всех остальных случаях.

eternitysharp 14.08.2018 09:50

Опять же, какую платформу JAX-RS вы используете? (уже задавался в предыдущих комментариях). Если вы хотите получить более точные ответы, это поможет проверить, работает ли он в вашем случае. Хотя это тот же стандарт JAX-RS, существуют различия в реализациях.

cdan 14.08.2018 22:23

Извините, если вопрос был непонятен. Именно Джерси входит в Weblogic 12c. Я обновлю вопрос этой информацией.

eternitysharp 16.08.2018 09:47

Хорошо, боюсь, я не привык к среде Джерси / Weblogic :-( Так что, возможно, у опытных в Джерси людей есть лучший ответ.

cdan 17.08.2018 15:38
Ответ принят как подходящий

Хотя возврат List <Long> в объекте Response не работает для меня, мне удалось обойти это, встроив список в новый класс.

Новый класс выглядит следующим образом:

public class LongArrayList {

    private List<Long> list;

    public LongArrayList() {

    }

    public LongArrayList(List<Long> list) {
        this.setList(list);
    }

    public List<Long> getList() {
        return list;
    }

    public void setList(List<Long> list) {
        this.list = list;
    }
}

Затем я возвращаю этот список в следующем виде:

return Response.ok(new LongArrayList(theOldLongList))
               .build();

К сожалению, это возвращает немного больший json, чем я бы хотел:

{"list":[5,12,29,30]}

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

Другие вопросы по теме