Spring3、JAXB2、Java6、NamespacePrefixMapper问题

Spring3、JAXB2、Java6、NamespacePrefixMapper问题,spring,tomcat,weblogic-10.x,jaxb2,java-6,Spring,Tomcat,Weblogic 10.x,Jaxb2,Java 6,我构建了一个简单的Spring3,Hibernate3/(JPA2),RESTful服务,托管在Tomcat6上,它使用JAXB2来封送结果。(它使用带注释的POJO。)我需要使用特定的名称空间前缀,因此我编写了一个自定义的com.sun.xml.bind.marshaller.NamespacePrefixMapper。我在应用程序中包含了JAXB2 RI JAR,一切正常 然后有人说这很好,我们也需要在WebLogic11g(10.3.3)下托管它。没问题,我创建了特殊的weblogic部署

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

然后有人说这很好,我们也需要在WebLogic11g(10.3.3)下托管它。没问题,我创建了特殊的weblogic部署描述符来偏好应用程序JAR,重命名了persistence.xml,并用JPA2 JAR将WAR包装在EAR中。它几乎奏效了

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

所以我的问题。。。我已经阅读了很多关于stackoverflow的帖子,其中包含了很多关于sun“内部”JAXB2实现的使用与将RI打包到应用程序的意见/分歧。这个问题还没有一个干净的解决方案吗?我的堆栈是否支持在不包含JAXB2 RI的情况下自定义映射名称空间前缀的另一种方法?我可以安全地使用Java6“内部”JAXB名称空间prefixmapper吗,或者这会随各种Java发行版一起出现吗?Spring3是否提供了另一种解决方案?java6jaxb2实现的真实情况是什么?它是否只供Sun(Oracle)内部使用


谢谢。

如评论中所述,我将总结中提到的内容

注意:我自己还没有试过,所以它可能不起作用

本质上,您将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
来处理前缀,通过执行上述操作,您可以告诉它如何处理前缀

再次声明:我只是重复从您的网络中屏蔽的网站内容,因此我不认为它是正确的,也不认为它是错误的。

将使用@XmlSchema注释中声明的名称空间前缀

有关更多信息,请参阅:


自JDK 6更新4以来,JAXB 2.1已包含在JDK 6中。如果应用服务器运行的是JDK 6,为什么需要将JAXB2 RI JAR添加到应用程序中?@Chin:使用RI时,还可以安全地使用它附带的
com.sun.xml
类,如
NamespacePrefixMapper
。如果您使用内置的Java6 JAXB,则必须使用
com.sun.xml.internal
包,这是非常不可取的。@John:请参阅此问题的公认答案以获得可能的解决方案:@skaffman:谢谢,但我无法从工作中看到。(被封锁了)你能给我要点吗?它是否完全避免了名称空间前缀?谢谢skaffman。我还没有试过那个作家。它需要比“returnmypojo;”更多的代码,但如果它避免包含JAXB2 RI或使用“内部”包,那么至少会让同一个应用程序同时在Tomcat和WebLogic中运行。我仍然想知道问题的答案。我尝试了这个解决方案,但遇到了一些问题,因为它阻止封送拆收器在打开的文档元素中定义名称空间和前缀。因此,我请了一位朋友打开链接并通过电子邮件将整个帖子的内容发送给我,这个解决方案还需要一个定制的封送员。(我的朋友还没有给我发代码。)我真的不认为这是创作者的想法。但非常感谢你们的努力。有来自“太阳”或SpringSource的人参加过这个论坛吗?这是一个显著的问题。到目前为止,我收集了一些解决方法,但没有合适的解决方案。也许我可以在我的应用程序中包含JAXB2 RI,但不知何故不会与我在WebLogic中的安全领域产生冲突。@John:值得一试。不过,这并不是什么大问题,因为名称空间前缀并不重要。撇开化妆品不谈,任何需要特定前缀的东西都有点破绽。我完全同意前缀应该是完全任意的。。。理论上。不幸的是,事实并非如此。在我的例子中,ns1,ns2,。。。还有rdf,Georgs等等。。。IE、Firefox和我的客户端看到普通XML文档和看到RSS提要之间的区别。我再次感谢你的领导。