gpt4 book ai didi

soap - cxf 解码错误 : unexpected element

转载 作者:行者123 更新时间:2023-12-05 01:02:38 26 4
gpt4 key购买 nike

我正在尝试使用 SOAP 服务,使用 maven cxf-codegen-plugin 生成 stub 。除了丑陋的服务外,大多数服务都很好。在这种情况下,当被调用时,服务会发送一个正确的响应,但是我生成的 stub 无法解码它,从而生成一个异常,例如(我用 urlx 之类的名称替换了 urls 以表示简短):

javax.xml.ws.soap.SOAPFaultException: Unmarshalling Error: unexpected element (uri:"url3", local:"cap"). Expected elements are <{url1}descComune>....<{url1}cap>...

实际上,意外字段是扩展的一部分,该扩展具有与扩展元素不同的指定命名空间。这里的命名空间定义:

    <?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions ...xmlns:ns1="url1" ... xmlns:ns3="url3" ... targetNamespace="someUrl">
<wsdl:documentation>WSDatiPersonali</wsdl:documentation>
<wsdl:types>
<xs:schema xmlns:ax226="url0" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url0">

扩展的 xs 是这样的:

<xs:schema xmlns:ax225="url1" xmlns:ax227="url0" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url1">
<xs:import namespace="url0"/>
<xs:complexType name="Indirizzo">
<xs:sequence>
<xs:element minOccurs="0" name="cap" nillable="true" type="xs:string"/>

</xs:sequence>
</xs:complexType>

而扩展的是:

<xs:schema xmlns:ax224="url3" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url3">
<xs:complexType name="Indirizzo">
<xs:complexContent>
<xs:extension base="ns1:Indirizzo">
<xs:sequence>
............

</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>

正如您所见,“cap”字段位于父亲内部,当服务响应中填充儿子的字段时,cxf 无法在儿子的命名空间下找到它。

有解决办法吗?

最佳答案

最后我找到了某种解决方法来禁用 SOAP 验证。实际上可以通过多种方式做到这一点:

  • 在响应类上使用注释,例如:

     @org.apache.cxf.annotations.EndpointProperty(key = "soap.no.validate.parts", value = "true") 
  • 为您的服务 stub 设置属性:

     JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setServiceClass(YourServiceClass.class);
    factory.setAddress(this.constants.SOME_URL);
    Map<String, Object> properties = factory.getProperties();
    if(properties==null){
    properties= new HashMap<String, Object>();
    }

    properties.put("soap.no.validate.parts", "true");
    /**
    * an other option is :
    * properties.put("set-jaxb-validation-event-handler", "false");
    */
    factory.setProperties(properties);
    WSDatiPersonaliPortType port = (WSDatiPersonaliPortType) factory.create();

我希望这对其他人有用。

关于soap - cxf 解码错误 : unexpected element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31164987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com