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 аннотация вашего метода получения.