Взаимодействие EJB-XML с использованием интерфейса JAXB
Вопрос
Я пытался добавить схему XML в существующий проект EJB.JAXB используется для привязки XML-схемы к классу Java.Поскольку мы собираемся использовать поисковую систему для сканирования DTO, когда EJB находится в сеансе.
Я не смог найти прямого подхода к сопоставлению файла класса сущности с XML-схемой.
Единственный способ добиться этого на данный момент — создать веб-службы, сгенерировать WSDL, который генерирует xml-схему (XSD), а затем проанализировать файл XSD через JAXB (команда xjc) для создания файлов классов Java.Теперь, используя файл Mapping-binding.xml, мы можем сопоставить как XML, так и файл класса Java.
Но теперь снова проблема в том, как сопоставить это с классом сущности.
Вот чего мы хотим достичь:
- Объект данных XML со схемой XML (это уже присутствует в спецификации JAXB).
- Затем Entity Bean расширяет или имеет интерфейс для этого объекта JAXB.
- Все функции персистентности управляются Entity Bean...
- Тогда Entity Bean будет содержать функции маршаллинга и демаршаллинга XML, имеющиеся в JAXB.
- Объект значения может быть получен в двоичной форме или в форме XML из объекта Entity Bean.
- JSP может легко извлечь схему XML и данные XML из объекта значения и выполнить над ними операции, такие как преобразования XSL.
Я утверждаю, что у Entity Beans нет стандартного способа взаимодействия с объектами JAXB.
Castor может быть решением, но опять же нам придется реализовать веб-сервисы или использовать Castor JDO.
Я обнаружил, что XStream весьма полезен, поскольку он использует класс конвертера, в котором вы можете вызывать объекты класса объектного компонента и генерировать XML-файл.Но я предпочитал не использовать другой класс, а включать функции в существующий класс компонента.
Можете ли вы помочь мне в этом отношении?
Я расскажу вам, чего я на самом деле пытаюсь достичь.Я создаю поисковую систему, которая будет вызываться во время сеанса EJB, будет использовать сканер через DTO и получать снимок в формате XML.Поиск будет по разным критериям.
Lucene — один из инструментов поисковой системы, но он использует свои собственные свойства и файлы (будет действовать скорее как автономный).
У меня уже есть DTO, которые используются веб-сервисами для связи между приложениями PHP и Java (уровень EJB).Я хотел повторно использовать эти DTO в jaxb в качестве сканера, чтобы получить выходные данные из таблиц в XML, что я не могу сделать, поскольку JAXB использует свои собственные сгенерированные классы через xml-схему.Как вы сказали, я еще не нашел способа указать JAXB на классы компонентов.
Решение
Тесная связь вашей модели данных (объектных компонентов) с вашим XML-интерфейсом может оказаться не самой лучшей идеей в мире;это не позволяет вам изменить одно, не изменяя другое.
Я не уверен на 100%, что понимаю, что вы пытаетесь сделать, но я думаю, что есть способ дать указание JAXB расширять классы, а не создавать новые.Вы можете создавать свои Entity Beans как обычно, а сгенерированные JAXB bean-компоненты расширять их дополнительной информацией.
Я могу сказать, что получение экземпляров Entity bean откуда-то другой чем ваш уровень персистентности (например, десериализация их из XML) будет огромный проблема для тебя.
Также обратите внимание, что использование XML для связи между приложениями Java (например, между уровнями JSP/Servlet и EJB) — плохая идея;маршалинг и дополнительная многословность XML дают вам очень мало;сериализацию объектов через RMI (это то, что за вас сделает EJB) будет гораздо проще реализовать, протестировать и поддерживать.
Другие советы
EclipseLink JAXB (MOXy) может использоваться для сопоставления объектов JPA с XML.
Для получения дополнительной информации см.: