java - CXF java.lang.ClassCastException : com. sun.org.apache.xerces.internal.dom.ElementNSImpl 无法转换为 com.tibco.ur.schemas.getocr.Output

标签 java xml web-services xsd cxf

我有一个定义“anyType”元素的 WSDL:

<?xml version="1.0" encoding="UTF-8"?>
<!--Created by TIBCO WSDL-->
<wsdl:definitions 
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
    xmlns:tns="http://www.tibco.com/UR/schemas/GenericWS" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="Untitled" targetNamespace="http://www.tibco.com/UR/schemas/GenericWS">
    <wsdl:types>
        <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:gws="http://www.tibco.com/UR/schemas/GenericWS" targetNamespace="http://www.tibco.com/UR/schemas/GenericWS" elementFormDefault="qualified" attributeFormDefault="unqualified">

            <xs:import namespace="http://www.tibco.com/UR/schemas/GetBranch" schemaLocation="GetBranch.xsd" />
            <xs:import namespace="http://www.tibco.com/UR/schemas/GetOCR" schemaLocation="GetOCR.xsd" />

            ...
            <xs:complexType name="ResultList">
                <xs:sequence>
                    <xs:element name="Result" minOccurs="0" maxOccurs="unbounded">
                        <xs:complexType>
                            <xs:sequence>
                                <xs:element name="Status">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="Return" type="xs:int"/>
                                            <xs:element name="Message" type="xs:string"/>
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                                <xs:element ref="gws:Input" minOccurs="0"/>
                                <xs:element ref="gws:Output" minOccurs="0" maxOccurs="unbounded"/>
                            </xs:sequence>
                            <xs:attribute name="QiD" type="xs:string"/>
                            <xs:attribute name="Service" type="xs:string"/>
                            <xs:attribute name="Version" type="xs:string"/>
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>
                <xs:attribute name="TiD" type="xs:string"/>
            </xs:complexType>
            <xs:element name="Input" type="xs:anyType"/>
            <xs:element name="Output" type="xs:anyType"/>
            <xs:element name="Queries" type="gws:QueryList"/>
            <xs:element name="Results" type="gws:ResultList"/>
        </xs:schema>
    </wsdl:types>
    <wsdl:service name="GenericWS.Service">
        <wsdl:port name="PortTypeEndpoint" binding="tns:PortTypeEndpointBinding">
            <soap:address location="http://localhost:8101/Generic/GenericWS.Service.serviceagent/PortTypeEndpoint"/>
        </wsdl:port>
    </wsdl:service>
    <wsdl:portType name="PortType">
        <wsdl:operation name="Operation">
            <wsdl:input message="tns:Request"/>
            <wsdl:output message="tns:Response"/>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="PortTypeEndpointBinding" type="tns:PortType">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <wsdl:operation name="Operation">
            <soap:operation style="document" soapAction="/Generic/GenericWS.Service.serviceagent/PortTypeEndpoint/Operation"/>
            <wsdl:input>
                <soap:body use="literal" parts="Input"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal" parts="Output"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:message name="Request">
        <wsdl:part name="Input" element="tns:Queries"/>
    </wsdl:message>
    <wsdl:message name="Response">
        <wsdl:part name="Output" element="tns:Results"/>
    </wsdl:message>
</wsdl:definitions>

如您所见,它使用 GetOCR.xsd :

<?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
     xmlns:spe="http://www.tibco.com/UR/schemas/GetOCR"
     targetNamespace="http://www.tibco.com/UR/schemas/GetOCR"
     elementFormDefault="qualified"
     attributeFormDefault="unqualified">
    <xs:complexType name="Input">
        <xs:sequence>
            <xs:element name="CO_EXTREF" type="xs:string">
            </xs:element>
            <xs:element name="ValidTodayOnly" type="xs:boolean" minOccurs="0">
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Output">
        <xs:annotation>
            <xs:documentation>Specific Output for GetBransh generic service.</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="Store" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:complexContent>
                        <xs:extension base="spe:Simple">
                            <xs:sequence>
                                <xs:element name="OCR" minOccurs="0" maxOccurs="unbounded">
                                    <xs:complexType>
                                        <xs:sequence>
                                            <xs:element name="Date" type="spe:YearMonth"/>
                                            <xs:element name="Sales" type="spe:Amount"/>
                                            <xs:element name="Cost" type="spe:Amount"/>
                                        </xs:sequence>
                                    </xs:complexType>
                                </xs:element>
                            </xs:sequence>
                        </xs:extension>
                    </xs:complexContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Simple">
        <xs:sequence>
            <xs:element name="ID" type="xs:int"/>
            <xs:element name="Label" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="YearMonth">
        <xs:sequence>
            <xs:element name="Year" type="xs:integer"/>
            <xs:element name="Month" type="xs:integer"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="Amount">
        <xs:sequence>
            <xs:element name="VatType" type="xs:string"/>
            <xs:element name="Currency" type="xs:string"/>
            <xs:element name="Amount" type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

我在 Maven 中生成了类文件:

<plugin>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-codegen-plugin</artifactId>
    <version>2.7.8</version>
    <executions>
        <execution>
            <id>generate-sources-cxf-Generic</id>
            <phase>generate-sources</phase>
            <configuration>
                <wsdlRoot>${basedir}/src/main/resources/wsdl</wsdlRoot>
                <sourceRoot>${project.build.directory}/generated/cxf</sourceRoot>
                <wsdlOptions>
                    <wsdlOption>
                        <wsdl>${basedir}/src/main/resources/wsdl/GenericWS.wsdl</wsdl>
                        <extraargs>
                            <extraarg>-client</extraarg>
                        </extraargs>
                    </wsdlOption>
                </wsdlOptions>
            </configuration>
            <goals>
                <goal>wsdl2java</goal>
            </goals>
        </execution>
    </executions>
</plugin>

我确实使用 CXF 调用 Web 服务:

final GenericWSService genericWSService = new GenericWSService();
final PortType portType = genericWSService.getPortTypeEndpoint();
...
final ResultList resultList = portType.operation(queryList);

返回的XML:

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <ns0:Results xmlns:ns0="http://www.tibco.com/UR/schemas/GenericWS">
            <ns0:Result Service="GetOCR" QiD="ref_89100-00281"
                Version="00">
                <ns0:Status>
                    <ns0:Return>0</ns0:Return>
                    <ns0:Message>Ok</ns0:Message>
                </ns0:Status>
                <ns0:Input xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                    xmlns:tibco_c2s_ns0="http://www.tibco.com/UR/schemas/GetOCR"
                    xsi:type="tibco_c2s_ns0:Input">
                    <tibco_c2s_ns0:CO_EXTREF>89100-00281</tibco_c2s_ns0:CO_EXTREF>
                    <tibco_c2s_ns0:ValidTodayOnly>false</tibco_c2s_ns0:ValidTodayOnly>
                </ns0:Input>
                <ns0:Output>
                    <ns1:Store xmlns:ns1="http://www.tibco.com/UR/schemas/GetOCR">
                        <ns1:ID>4814</ns1:ID>
                        <ns1:Label>FOOT LOCKER</ns1:Label>
                        <ns1:OCR>
                            <ns1:Date>
                                <ns1:Year>2014</ns1:Year>
                                <ns1:Month>3</ns1:Month>
                            </ns1:Date>
                            <ns1:Sales>
                                <ns1:VatType>NET</ns1:VatType>
                                <ns1:Currency>EUR</ns1:Currency>
                                <ns1:Amount>1728832.0</ns1:Amount>
                            </ns1:Sales>

我可以浏览此响应,直到进入 xsd 部分:

final List<ResultList.Result> results = resultList.getResult();

            for (final ResultList.Result result : results) {

                final ResultList.Result.Status status = result.getStatus();
                final int codeRetour = status.getReturn();
                final String message = status.getMessage();

                final List<Object> outputs = result.getOutput();

                for (final Object output : outputs) {

                    final Output outputOCR = (Output) output;

                    final List<Output.Store> stores = outputOCR.getStore();

最后一行抛出一个“java.lang.ClassCastException”(当然):

java.lang.ClassCastException: com.sun.org.apache.xerces.internal.dom.ElementNSImpl cannot be cast to com.tibco.ur.schemas.getocr.Output

我尝试了很多方法(使用 ElementNSImpl)但没有任何效果:-(

欢迎任何想法...

Th.

最佳答案

根据 wsdl/top level schema,“Output”元素是一个 xsd:anyType。因此,JAXB 会将其解码为 DOM 元素,除非线路上有信息表明它是什么类型。这基本上意味着需要 xsi:type="tns:Output"属性。

如果您知道它将是一个输出,请更改 wsdl 中的架构以使输出元素的类型为输出。 (我会对输入做同样的事情)

关于java - CXF java.lang.ClassCastException : com. sun.org.apache.xerces.internal.dom.ElementNSImpl 无法转换为 com.tibco.ur.schemas.getocr.Output,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23675105/

相关文章:

java - 在 Java 中覆盖引用

javascript - 在 XForms 中,使用 Orbeon,如何通过 jQuery 更新 XML 实例?

c# - 如何使用 C# 发送/接收 SOAP 请求和响应?

java - 在 Web 服务中调用 getUserPrincipal() 返回匿名

android - 如何在android应用程序中的php mysql服务器中获取和上传数据?

java - 试图从扩展类中获得父类(super class)

java - BoxLayout 中按钮的水平放置取决于操作系统

java - 参数无法解析为变量?

java - Android:从 .java 文件设置 strings.xml 值

c# - 如何将文件编码从 windows-1251 更改为 utf-8