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

Пожалуйста, проявите ко мне немного терпения, я знаю, что таких вопросов уже так много, и я не смог решить свою проблему, которая кажется такой простой, и не уверен, что мне не хватает (потратил часы, пытаясь понять это). Я использовал следующий архетип 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.

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


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


Ответы (1)


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

См. также

person Paul Samsotha    schedule 03.07.2016