Spring3, JAXB2, Java6, вопросы NamespacePrefixMapper

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

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

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

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

Спасибо.


person John    schedule 04.01.2011    source источник
comment
JAXB 2.1 включен в JDK 6, начиная с JDK 6 Update 4. Если сервер приложений работает под управлением JDK 6, зачем вам нужно добавлять jar-файлы JAXB2 RI в ваше приложение?   -  person Chin Huang    schedule 05.01.2011
comment
@Chin: Когда вы используете RI, вы также можете безопасно использовать классы com.sun.xml, которые идут с ним, например NamespacePrefixMapper. Если вы используете встроенный Java6 JAXB, вы должны использовать пакеты com.sun.xml.internal, что крайне нежелательно.   -  person skaffman    schedule 05.01.2011
comment
@John: см. принятый ответ на этот вопрос для возможного решения: stackoverflow.com/questions/1982977/   -  person skaffman    schedule 05.01.2011
comment
stackoverflow.com /вопросы/2326107/   -  person Bozho    schedule 05.01.2011
comment
@skaffman: Спасибо, но я не вижу func .nl/community/knowledgebase/ с работы. (Он заблокирован.) Можете ли вы дать мне суть? Он полностью избегает NamespacePrefixMapper?   -  person John    schedule 05.01.2011
comment
@John: Хорошо, я повторил это как ответ.   -  person skaffman    schedule 05.01.2011
comment
@Божо: Спасибо. Прошел почти год с тех пор, как вы написали: нет лучшего способа сделать это, и это необходимая функция. Я надеялся, что к настоящему времени кто-нибудь в Sun разберется с этим.   -  person John    schedule 05.01.2011


Ответы (2)


Как упоминалось в комментариях, я резюмирую то, что упоминается в 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 для обработки префиксов, и, делая вышеизложенное, вы говорите ему, как это сделать.

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

person skaffman    schedule 05.01.2011
comment
Скафман спасибо. Я не пробовал XMLStreamWriter. Для этого требуется намного больше кода, чем просто return myPojo;, но если он избегает включения JAXB2 RI или использования внутренних пакетов, он, по крайней мере, позволит одному и тому же приложению работать как в Tomcat, так и в WebLogic. Я все еще хотел бы знать ответы на свои вопросы. - person John; 05.01.2011
comment
Я попробовал это решение, но столкнулся с некоторыми проблемами, поскольку оно не позволяет маршаллеру определять пространства имен и префиксы в открывающемся элементе документа. Итак, я попросил друга открыть ссылку и отправить мне по электронной почте содержание всего поста, и это решение также требует развертывания пользовательского маршаллера. (Мой друг еще не прислал мне код.) Я действительно не думаю, что это то, что имели в виду создатели. Но большое спасибо за ваши усилия. - person John; 05.01.2011
comment
Кто-нибудь из Sun или SpringSource когда-либо участвовал в этом форуме? Это замечательная проблема. Пока что у меня есть небольшая коллекция обходных путей, но нет подходящего решения. Возможно, я могу включить JAXB2 RI в свое приложение, но каким-то образом не вызвать конфликт с моей областью безопасности в WebLogic. - person John; 05.01.2011
comment
@Джон: Стоило попробовать. Однако на самом деле это не большая проблема, поскольку префиксы пространств имен не должны иметь значения. Помимо косметики, все, что требует определенного префикса, немного сломано. - person skaffman; 05.01.2011
comment
Я полностью согласен с тем, что префиксы должны быть совершенно произвольными... в теории. На практике, к сожалению, нет. В моем случае разница между ns1, ns2,... и rdf, georss и т.д... заключается в разнице между IE, Firefox и моим клиентом, который видит обычный XML-документ и видит RSS-канал. Опять же, я ценю лидерство. - person John; 05.01.2011

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

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

person bdoughan    schedule 26.01.2011