Xml 如何扩展CXF wsdl2java生成的类所使用的JAXBContext,以包含额外的ObjectFactory
什么?Xml 如何扩展CXF wsdl2java生成的类所使用的JAXBContext,以包含额外的ObjectFactory,xml,cxf,jax-ws,wsdl2java,sabre,Xml,Cxf,Jax Ws,Wsdl2java,Sabre,什么? InputStream inputStream = MyUnitTest.getResourceAsStream(filename) Unmarshaller unmarshaller = context.createUnmarshaller() JAXBElement<TravelItineraryReadRS> travelItineraryReadRS = unmarshaller.unmarshal(new StreamSource(input
InputStream inputStream = MyUnitTest.getResourceAsStream(filename)
Unmarshaller unmarshaller = context.createUnmarshaller()
JAXBElement<TravelItineraryReadRS> travelItineraryReadRS = unmarshaller.unmarshal(new StreamSource(inputStream), TravelItineraryReadRS.class)
我正在使用CXF的wsdl2java从外部提供的wsdl(TravelInventureReadrq.wsdl
)生成Java类。
调用该操作时,我得到一个响应,可以将其解组到Java类中,但一个元素及其子元素除外,它们默认为DOM元素(ElementNSImpl
)
此元素有什么特别之处?
InputStream inputStream = MyUnitTest.getResourceAsStream(filename)
Unmarshaller unmarshaller = context.createUnmarshaller()
JAXBElement<TravelItineraryReadRS> travelItineraryReadRS = unmarshaller.unmarshal(new StreamSource(inputStream), TravelItineraryReadRS.class)
所讨论的元素(PriceQuote
)属于OpenReservation架构中定义为xs:any
的类型(PriceQuoteType
):
<xsd:complexType name="PriceQuoteType">
<xsd:choice>
<xsd:any processContents="strict"/>
</xsd:choice>
</xsd:complexType>
部分成功
然后,我可以使用初始化为以下内容的JAXBContext
独立地解组PriceQuoteInfo
XML:
JAXBContext context=JAXBContext.newInstance(PQSPriceQuoteInfo.class)
当将PriceQuoteInfo
解组为TravelInventureReadrs
元素的子元素时,我还可以通过将JAXBContext
声明为:
JAXBContext context = JAXBContext.newInstance(TravelItineraryReadRS.class, PQSPriceQuoteInfo.class)
或者,通过使用其对象工厂:
JAXBContext context = JAXBContext.newInstance(com.sabre.services.res.tir.v3_10.ObjectFactory.class, com.sabre.ns.ticketing.pqs.v1_0.ObjectFactory.class)
解组代码是什么样子的?
InputStream inputStream = MyUnitTest.getResourceAsStream(filename)
Unmarshaller unmarshaller = context.createUnmarshaller()
JAXBElement<TravelItineraryReadRS> travelItineraryReadRS = unmarshaller.unmarshal(new StreamSource(inputStream), TravelItineraryReadRS.class)
虽然不是很优雅,但它表明这种方法试图解组PriceQuoteInfo
,而不是将其作为DOM对象,但XML与我生成的GetPriceQuote
模式并不完全匹配。我要么关闭验证,要么找到匹配的模式来解决这个问题
问题
是否可能影响CXF/JAX-WS web服务调用中使用的JAXBContext
,以便将PriceQuoteInfo
的ObjectFactory
添加到生成的*PortType
例如:是否有一种方法可以通过使用外部绑定影响生成的@xmlseeald注释,使其包含此ObjectFactory?也有类似的问题。我没有找到直接影响
JAXBContext
的方法,但在创建JAX-WS代理时,我能够通过JaxWsProxyFactoryBean.setProperties()
注入我的ObjectFactory:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setProperties(
Collections.singletonMap(
"jaxb.additionalContextClasses",
new Class[{com.mypackage.ObjectFactory.class});
通过这种方式,我得到了JAXBElement
而不是原始DOM对象(T
在您的例子中是PriceQuoteInfo
)。
希望对您有所帮助。您有一个语法错误,正确的是:factory.setProperties(Collections.singletonMap(“jaxb.additionalContextClasses”),new Class[]{ObjectFactory.Class});