我构建了一个简单的Spring3,Hibernate3 /(JPA2),RESTful服务,该服务托管在Tomcat6上,该服务使用JAXB2整理结果。 (它使用带注释的pojos。)我需要使用特定的名称空间前缀,因此我编写了一个自定义com.sun.xml.bind.marshaller.NamespacePrefixMapper。我在应用程序中包括了JAXB2 RI jar,一切正常。
然后有人说这很棒,我们也需要将其托管在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(Oracle)的内部使用吗?
谢谢。
最佳答案
如评论中所述,我将总结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
来处理这些前缀,并且通过执行上述操作,您将告诉它如何做。再说一遍:我只是在重复被您的网络阻止的网站中的内容,因此,我不认为它是正确的,也不能怪它是错误的。