我构建了一个简单的Spring3,Hibernate3/(JPA2),RESTful服务,托管在Tomcat6上,它使用JAXB2来编组结果。(它使用带注释的pojos。)我需要使用特定的名称空间前缀,所以我编写了一个自定义的com.sun.xml.bind.marshaller.NamespacePrefixMapper.我将JAXB2 RI jars包含在我的应用程序中,一切工作正常。
然后有人说这很好,我们也需要在WebLogic 11g (10.3.3)下托管它。没问题,我创建了特殊的weblogic部署描述符以偏爱应用程序WAR,重命名为my persistence.xml,并用JPA2 WAR将战争包装在耳朵中。它几乎工作得很好。
不幸的是,我们的WebLogic服务器运行的自定义安全领域也使用JAXB,并导致与我的应用程序发生冲突。因此,我从应用程序中删除了JAXB jar,它在WebLogic中运行得很好。当然,除非我将JAXB jars添加到Tomcat中,否则它将不再在Tomcat下运行。我想避免这种情况。
所以我的问题..。我读过很多关于stackoverflow的帖子,其中包含了很多关于使用sun“内部”JAXB2实现与将RI打包到应用程序中的观点/分歧。这个问题还没有一个干净的解决方案吗?我的堆栈是否支持另一种不包含JAXB2 RI的自定义名称空间前缀映射方式?我可以安全地使用Java6的“内部”Java吗?或者它会随各种NamespacePrefixMapper版本一起出现和消失吗?Spring3是否提供了另一种解决方案?关于Java6 JAXB2实现的真实故事是什么?它是否仅供Sun(Oracle)内部使用?
谢谢。
发布于 2011-01-05 20:41:46
正如评论中提到的,我将总结一下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-27 01:28:17
EclipseLink JAXB (MOXy)将使用@XmlSchema注释中声明的名称空间前缀。
有关详细信息,请参阅:
https://stackoverflow.com/questions/4599367
复制相似问题