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});