当前位置: 首页 > 知识库问答 >
问题:

cxf解组错误:意外元素

汤跃
2023-03-14

我尝试使用SOAP服务,用maven cxf-codegen-plugin生成存根。大多数服务都很好,除了一个难看的服务。在这种情况下,当被调用时,服务发送一个正确的响应,但是我生成的存根无法解组它,从而生成一个异常,比如(我用一个类似urlx的名称替换了URL,以简化) :

javax.xml.ws.soap。SOAPFaultException:解组错误:意外元素(uri:“url3”,local:“cap”)。预期元素为

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

    <?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无法在儿子的命名空间下找到它。

有办法修理吗?

共有1个答案

楚墨一
2023-03-14

最后,我找到了某种禁用soap验证的变通方法。事实上,有很多方法可以做到:

> < li>

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

 @org.apache.cxf.annotations.EndpointProperty(key = "soap.no.validate.parts", value = "true") 

设置服务存根的属性:

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

我希望这对其他人有用。

 类似资料:
  • 我正试图将我的web服务客户机从Apache AXIS-1迁移到Apache CXF。web服务本身运行om AXIS-1,不受我的控制。 我生成了所有CXF工件,客户端一直工作良好,直到服务抛出任何错误。错误的XML如下所示: 这使得CXF生成的客户端异常下降: AFAIU在这个stacktrace中,unmarshaller希望fault元素有特定的命名空间声明,但它没有。 添加带有默认命名空

  • 背景: 我使用JAXB将XML解组为Java对象。最初,我只是使用JAXB来执行解组。然后对代码进行静态分析,并提出了XML外部实体注入的高关键性问题。经过一点研究,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析

  • Borrower类使用基于XSD的JaxB解析,使用JDK1.7和Eclipse IDE。 : } XSD: XML:

  • 为什么在使用JAXB时需要使用? 我的工作场景是这样的: 我正在做一个从.NET到Java的转换项目。在.NET中,类的编写与POJO类似。我只是在代码中添加了注释(如、等)。并解决了与注释相关的错误。 现在我犯了这样的错误: XML文件如下: POJO类:

  • 我尝试解组一个XML文件到一个对象。 我得到了这个错误: 我的解组过程如下所示: 我的XML实体看起来像: 我的XMLFile看起来像: 那么,我的解组过程出了什么问题?XML实体是用xjc创建的。 我也尝试了简单的xml文件/对象。这对我来说很好。

  • 第22行是: 我不知道为什么我会得到这个,我已经检查了我的语法,所有似乎是正确的。它基本上不喜欢执行查询后的任何内容 编辑: 我明白这是容易SQL注入,但我这样做只是为了测试目的。