Spring3,JAXB2,Java6,NamespacePrefixMapper问题

时间:2011-01-04 23:04:01

标签: spring tomcat weblogic-10.x jaxb2 java-6

我构建了一个简单的Spring3,Hibernate3 /(JPA2),RESTful服务,托管在Tomcat6上,使用JAXB2来编组结果。 (它使用带注释的pojos。)我需要使用特定的名称空间前缀,所以我写了一个自定义的com.sun.xml.bind.marshaller.NamespacePrefixMapper。我在应用程序中包含了JAXB2 RI罐子,一切正常。

然后有人说这很好,我们也需要在WebLogic 11g(10.3.3)下托管它。没问题,我创建了特殊的weblogic部署描述符来优先选择应用程序jar,重命名我的persistence.xml,并将WAR包装在带有JPA2 jar的EAR中。它的效果很好,差不多。

不幸的是,我们的WebLogic服务器运行一个自定义安全领域,该领域也使用JAXB并导致与我的应用程序冲突。所以我从应用程序中删除了JAXB jar,它在WebLogic中运行良好。当然,除非我将JAXB jar添加到Tomcat,否则它不再在Tomcat下运行。我想避免这种情况。

所以我的问题......我已经阅读了很多关于stackoverflow的帖子,其中包含很多关于使用sun“内部”​​JAXB2实现与使用你的应用程序打包RI的意见/分歧。这个问题还没有一个干净的解决方案吗?我的堆栈是否支持另一种自定义映射我的命名空间前缀而不包含JAXB2 RI的方法?我可以安全地使用Java6“内部”JAXB NamespacePrefixMapper,还是可以使用各种Java版本? Spring3是否提供另一种解决方案? Java6 JAXB2实现的真实故事是什么?它仅供Sun(甲骨文)内部使用吗?

感谢。

2 个答案:

答案 0 :(得分:0)

正如评论中所提到的,我将总结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来处理前缀,通过上面的操作,你告诉它如何做到这一点。

再说一遍:我只是重复网站上被网络拦截的内容,所以我不相信它是正确的,也不会因为错误而受到指责。

答案 1 :(得分:0)

EclipseLink JAXB (MOXy)将使用@XmlSchema注释中声明的名称空间前缀。

有关详细信息,请参阅: