Spring3, JAXB2, Java6, NamespacePrefixMapper вопросы - PullRequest
3 голосов
/ 05 января 2011

Я создал простой сервис RESTful для Spring3, Hibernate3 / (JPA2), размещенный на Tomcat6, который использует JAXB2 для упорядочения результатов. (Он использует аннотированные pojos.) Мне нужно было использовать определенные префиксы пространства имен, поэтому я написал собственный com.sun.xml.bind.marshaller.NamespacePrefixMapper. Я включил банки JAXB2 RI в свое приложение и все работало нормально.

Тогда кто-то сказал, что это здорово, нам нужно разместить его и под WebLogic 11g (10.3.3). Нет проблем, я создал специальные дескрипторы развертывания weblogic, чтобы предпочесть jar приложения, переименовал мой persistence.xml и обернул WAR в EAR с jar JPA2. Работало отлично, почти.

К сожалению, наш сервер WebLogic использует пользовательскую область безопасности, которая также использует JAXB и вызывает конфликты с моим приложением. Поэтому я удалил баночки JAXB из приложения, и он отлично работает в WebLogic. Конечно, он больше не работает под Tomcat, если я не добавлю банки JAXB в Tomcat. Я бы хотел этого избежать.

Итак, мои вопросы ... Я прочитал довольно много постов о stackoverflow, которые содержат множество мнений / разногласий относительно использования "внутренней" реализации JAXB2 от sun против упаковки RI с вашим приложением. Нет ли еще чистого решения этой проблемы? Поддерживает ли мой стек другой способ пользовательского сопоставления моих префиксов пространства имен без включения RI JAXB2? Могу ли я безопасно использовать «внутренний» Java6 JAXB NamespacePrefixMapper, или он будет приходить и уходить с различными выпусками Java? Spring3 предлагает другое решение? Какова реальная история реализации Java6 JAXB2? Это только для внутреннего использования Sun (Oracle)?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 января 2011

EclipseLink JAXB (MOXy) будет использовать префиксы пространства имен, как объявлено в аннотации @XmlSchema.

Для получения дополнительной информации см .:

0 голосов
/ 05 января 2011

Как уже упоминалось в комментариях, я обобщу то, что упоминается в http://www.func.nl/community/knowledgebase/customize-namespace-prefix-when-marshalling-jaxb.

Примечание: я сам не пробовал, поэтому может не сработать.

По сути, вы настраиваете маршаллер JAXB для использования XMLStreamWriter при маршалинге и настраиваете его для сопоставления префиксов, например,

XMLStreamWriter xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(writer);
xmlStreamWriter.setPrefix("func", "http://www.func.nl");

JAXBContext context = JAXBContext.newInstance(object.getClass());
Marshaller marshaller = context.createMarshaller();

marshaller.marshal(object, xmlStreamWriter);

Идея состоит в том, что если JAXB не был предоставлен префиксный преобразователь, то он оставит до XMLStreamWriter для обработки префиксов, и, выполнив вышеизложенное, вы скажете, как это сделать .

Опять же: я просто повторяю контент с веб-сайта, который заблокирован в вашей сети, поэтому я не беру на себя ответственность за его правильность и не виню его за неправильность.

...