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