MarshallingView весной, чтобы настроить вывод? - PullRequest
1 голос
/ 10 января 2010

У меня есть несколько POJO, которые являются основой для этого RESTful API, над которым я работаю. Тем не менее, в некоторые ответы мне нужно включить некоторую другую информацию, чтобы сделать API более полным. Я действительно не хочу помещать эту дополнительную информацию в POJO, но включаю ее на уровне веб-службы, как если бы она была.

Имеется в виду «Люди», у которых есть «Назначения». Каждое назначение имеет только одного человека.

Итак, у меня есть вызов RESTful, такой как / Patients / 1, и он в основном захватывает POJO для Персона, и в настоящее время я использую XStream для его сериализации и отправки в путь. Это прекрасно работает, но я хотел бы сделать что-то вроде этого:

<Person> 
<firstName>James</firstName>
 ... other fields ...
<nextAppointment href="/Appointment/12345>2010-02-19</nextAppointment>
<prevAppointment href="/Appointment/12346>2010-01-01</prevAppointemnt>
</Person>

Если следующая и предыдущая встречи фактически не включены в Персональный POJO. Я ищу хороший «весенний путь» для достижения этой цели. Клиент может сделать что-то вроде этого / Patients / 1 / PreviousAppointment и / Patients / 1 / NextAppointment, но я собираюсь сократить количество вызовов (может быть, до оптимизации?) И дать им возможность получить больше информации, если они нуждаются это с помощью он HREF.

Это очень элегантно, используя XStreamMarshaller, так как все, что я делаю, это вручную отображаю POJO или список POJO и обрабатывает его. Но мне нужно, чтобы те немного поправились, прежде чем их отправят.

Спасибо!

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Решение вашей проблемы: СОЗДАЙТЕ ПОЛЬЗОВАТЕЛЬСКИЙ КОНВЕРТЕР ...

открытый класс CustomizedConverter реализует конвертер {

@ Override public void marshal (Источник объекта, писатель HierarchicalStreamWriter, контекст MarshallingContext) {....}

@ Override открытый объект unmarshal (читатель HierarchicalStreamReader, контекст UnmarshallingContext) {..}

@ Override public boolean canConvert (Class clazz) {..}

}

Чтобы узнать, как использовать конвертер с маршаллером, обратитесь к this .

Таким образом, в основном, ПРЕОБРАЗОВАТЕЛЬ работает с POJO и гарантирует, что мы получим XML-ответ, как указано в контракте.

1 голос
/ 10 января 2010

Это проблема с передачей ваших бизнес-объектов непосредственно маршаллеру - у вас очень мало гибкости в том, как они превращают этот объект в ответ. Есть что-то, что нужно сказать для предварительной трансформации объектов, вы получаете больше контроля таким образом.

Так что, если у вас есть определенная выходная структура, которую вы хотите, то с XStream вам нужно построить структуру класса, которая выглядит так. Затем вы преобразуете свои бизнес-объекты в структуру этого класса и вместо этого передаете ее в XStream.

Это может показаться менее изящным, но ваша система будет гораздо менее подвержена поломкам из-за небольших изменений в вашей модели бизнес-объектов, чем будет ваша текущая система на основе XStream.

...