Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Джерси с Grizzly: получение MessageBodyWriter не найдено для типа носителя = application/json

Автор вопроса: Aliyu FonyuyОтветов: 1

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

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 -DarchetypeGroupId=org.glassfish.jersey.archetype

В файле pom.xml я раскомментировал зависимость moxy для поддержки JSON.

<dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-moxy</artifactId>
</dependency>

Затем я добавил класс Person, как показано ниже:

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Person {

  private String firstName;
  private String lastName;

  public Person(String firstName, String lastName) {
      this.firstName = firstName;
      this.lastName = lastName;
  }

  public String getFirstName() {
      return firstName;
  }

  public void setFirstName(String firstName) {
      this.firstName = firstName;
  }

  public String getLastName() {
      return lastName;
  }

  public void setLastName(String lastName) {
      this.lastName = lastName;
  }
}

MyResource.java выглядит следующим образом:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("myresource")
public class MyResource {

  @Path("/person")
  @GET
  @Produces(MediaType.APPLICATION_JSON)
  public Person getPerson() {
      return new Person("FistName","LastName");
  }

}

Затем я запускаю приложение и выдаю следующее, чтобы получить Person:

http://localhost:8080/myapp/myresource/person

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

org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor aroundWriteTo SEVERE: MessageBodyWriter not found for media type=application/json, type=class jersey.grizzly.Person, genericType=class jersey.grizzly.Person.

Я не смог понять, чего мне не хватает (и безрезультатно просмотрел множество предложенных ответов), и мог бы использовать другой набор глаз/точку зрения.

  • Я знаю, что для чтения требуется конструктор по умолчанию, но я не уверен насчет писателя. Вы можете попробовать добавить конструктор по умолчанию в свой класс модели. Paul Samsotha 02.07.2016
  • Спасибо @peeskillet, это была проблема. Не могу поверить, что я попал в ловушку. Aliyu Fonyuy 03.07.2016
  • Учитывая, что ответ был в комментарии, как мне отметить это как ответ? @peeskillet, вы хотите вместо этого сделать комментарий ответом, чтобы я закрыл это? (Если нет другого способа добиться того же, когда ответ находится в комментарии) Aliyu Fonyuy 03.07.2016

javamavenjsongrizzly

Ответы

Ответ 1 · рейтинг 1 · Paul Samsotha

Учитывая, что MOXy является производным от JAXB, а JAXB требует конструкторов без аргументов (по умолчанию) для своих типов, вы должны иметь конструктор без аргументов в своих классах моделей.

См. также

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы