3

我构建了一个简单的 Spring3、Hibernate3/(JPA2)、RESTful 服务,托管在 Tomcat6 上,它使用 JAXB2 来编组结果。(它使用带注释的 pojo。)我需要使用特定的命名空间前缀,所以我编写了一个自定义的 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)内部使用吗?

谢谢。

4

2 回答 2

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来处理前缀,并且通过执行上述操作,您就是在告诉它如何去做。

再说一遍:我只是在重复网站上被您的网络屏蔽的内容,所以我不认为它是正确的,也不怪它是错误的。

于 2011-01-05T12:41:46.060 回答
0

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

有关更多信息,请参阅:

于 2011-01-26T17:28:16.723 回答