Возврат сущностей JPA из методов веб-службы с использованием JAXB и Eclipselink Moxy

Я разрабатываю приложение Java EE для развертывания на сервере приложений WebSphere. В этом приложении у меня есть веб-служба, через которую я хотел бы передавать объекты сущностей JPA как результаты вызовов методов. Проблема возникает из-за петель, порожденных отношениями сущностей.

Я использовал Eclipselink Moxy, чтобы решить проблему обратных ссылок между объектами JPA. Однако, поскольку я не вызываю реализацию JAXB сам, а WAS вызывает свою собственную, аннотация @XmlInverseReference игнорируется. Я не хочу использовать аннотацию @XmlTransient, так как мне важно получить все объекты, на которые есть ссылки, в качестве результата метода.

Можно ли использовать Moxy в качестве реализации WebSphere JAXB по умолчанию? Или я могу создать адаптеры JAXB для своих объектов, которые затем во время выполнения будут добавлять аннотации @XmlTransient? Мне это нужно, поскольку у меня есть методы, которые возвращают сущности, ссылающиеся на другие сущности, но также возвращают ссылочные сущности с их ссылками на источники отношений базы данных.


person dpesic    schedule 05.12.2012    source источник


Ответы (1)


Примечание. Я EclipseLink JAXB (MOXy)< /strong> руководитель и участник JAXB (JSR- 222) группа экспертов.

В реализациях JAX-WS не требуется, чтобы они могли переключаться в альтернативные реализации JAXB. Одним из вариантов в средах, которые не поддерживают MOXy в качестве провайдера JAXB в JAX-WS, является использование стандартного механизма Provider.

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

void afterUnmarshal(Unmarshaller, Object parent);

Примечание. Вам нужно будет аннотировать это свойство с помощью @XmlTransient.

MOXy можно использовать в качестве провайдера JAXB для JAX-WS в следующих средах:

person bdoughan    schedule 05.12.2012
comment
Большое спасибо за ответ. Вариант с реализацией метода afterUnmarshal у меня не работает, потому что мой маршалинг должен работать в обе стороны, от родителя к дочернему и наоборот, а это значит, что я нигде не могу использовать @XmlTransient. Можете ли вы предоставить немного больше информации о том, как установить Moxy в качестве поставщика JAXB в WebSphere? - person dpesic; 05.12.2012
comment
В аннотации @XmlInverseReference есть опечатка - SO не принимает правки длиной менее 6 символов :( - person Jacek Laskowski; 07.12.2012
comment
@JacekLaskowski - Спасибо, что указали на опечатку, теперь она исправлена. - person bdoughan; 07.12.2012