2010-01-10 3 views
1

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

Он имеет дело с людьми, которые имеют «Назначения». У каждой встречи только один человек.

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

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

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

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

Спасибо!

ответ

1

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

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

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

+1

Это имеет смысл.Поэтому я думаю, что у меня в основном есть два варианта: либо генерировать XML самостоятельно, используя различные бизнес-объекты, которые у меня есть, либо создать новый объект, который представляет формат вывода, который я хочу иметь, и использовать XStream. Проблема с новыми объектами заключается в том, что для этого потребуется куча кода клея и дублирование большинства полей из реальных объектов POJO. Теперь я просто подумываю о том, чтобы позволить клиенту собрать дополнительную информацию через дополнительные вызовы API, пока не будет доказано, что производительность неприемлема. –

1

Решение вашей проблемы: СОЗДАТЬ CUSTOMIZEDCONVERTER ...

общественного класса CustomizedConverter реализует конвертер {

@Override общественного недействительными маршалом (источник объекта, HierarchicalStreamWriter писатель, MarshallingContext контекст) {.... }

@Override общественного объекта распаковать (HierarchicalStreamReader читатель, UnmarshallingContext контекст) {..}

@Override общественного булевой canConvert (класс clazz) {..}

}

Чтобы знать, что использовать преобразователь с ИАС см this.

Таким образом, в основном конвертер работает на POJO и гарантирует, что мы получим ответ XML, как указано в контракте.

Смежные вопросы