RestEasy-Jax-rs-отправка пользовательского объекта в теле ответа

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

допустим у меня есть объект типа Person. Я пытаюсь отправить тело ответа на отдых, как это.

  ResponseBuilder response = Response.ok().entity(personObj);
  return response.build();

но я 500 ошибка. Попытался это:

  ResponseBuilder response = Response.status(Status.OK).entity(personObj);
  return response.build();

та же ошибка.

попробовал установить тип контента как text/xml. Бесполезно. Я что-то упускаю? Я попробовал погуглить. Но не так много примеров, особенно с обычаем объекты;

он возвращается нормально, если я просто передаю строку в entity() метод.

1 ответов


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

  • вам нужно аннотировать свой метод ресурсов с помощью @Produces аннотация, чтобы сообщить Resteasy, какой тип возврата метода должен быть.

    например, метод ниже возвращает XML и JSON в зависимости от того, что клиент запрашивает в их Accept заголовок.

@GET
@Produces({MediaType.APPLICATION_JSON, 
           MediaType.APPLICATION_XML})
public Response foo()
{
     PersonObj obj = new PersonObj();

     //Do something...
     return Response.ok().entity(obj).build();
}

Resteasy поддерживает маршалинг следующих типов данных по умолчанию:

enter image description here

если типы данных, которые вы хотите поддерживать, находятся в этой таблице, то это означает, что они поддерживаются JAXB и все, что вам нужно сделать, это комментировать ваш PersonObj класс с аннотациями JAXB, чтобы рассказать ему, как Маршалл и разоблачить объект.

@XmlRootElement
@XmlType(propOrder = {"firstName", "lastName"})
public class PersonObj
{
  private String firstName;
  private String lastName;

  //Getters and Setters Removed For Brevity
}

что делать, если ваш content-type не поддерживается из коробки?

если у вас есть пользовательский тип содержимого, которое вы хотели бы Маршалл, то вам нужно создать MessageBodyWriter реализация, которая расскажет Resteasy, как Маршалл тип.

Provider
@Produces({"application/x-mycustomtype"})
public class MyCustomTypeMessageBodyWriter implements MessageBodyWriter {

}

просто реализовать интерфейс и зарегистрировать его, как любой другой поставщик.

если вы хотите прочитать пользовательский тип контента, вам нужно реализовать пользовательский MessageBodyReader для обработки входящего типа и добавления его в @Consumes аннотация вашего метода получения.