Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XSD用于弹簧、can和x27;我无法让它与WSDL匹配_Java_Spring_Soap_Xsd_Wsdl - Fatal编程技术网

Java XSD用于弹簧、can和x27;我无法让它与WSDL匹配

Java XSD用于弹簧、can和x27;我无法让它与WSDL匹配,java,spring,soap,xsd,wsdl,Java,Spring,Soap,Xsd,Wsdl,对于我正在进行的项目,我们需要创建一个soapweb服务(使用springboot)。实际的接口和消息格式由WSDL定义。问题是,根据我从文档中了解的情况(例如),我实际上需要一个XSD(WSDL将由此生成) 因为只有WSDL,所以我尝试自己创建XSD以在应用程序中使用。在这里,我遇到了几个问题,最大的问题是它接受的请求消息不是WSDL接受的消息 WSDL只接受名为payment的请求,而我的请求需要paymentRequest作为主体元素的名称。这可能很简单,但我找不到如何解决这个问题 简化的

对于我正在进行的项目,我们需要创建一个soapweb服务(使用springboot)。实际的接口和消息格式由WSDL定义。问题是,根据我从文档中了解的情况(例如),我实际上需要一个XSD(WSDL将由此生成)

因为只有WSDL,所以我尝试自己创建XSD以在应用程序中使用。在这里,我遇到了几个问题,最大的问题是它接受的请求消息不是WSDL接受的消息

WSDL只接受名为
payment
的请求,而我的请求需要
paymentRequest
作为主体元素的名称。这可能很简单,但我找不到如何解决这个问题

简化的wsdl:


请求示例:


?
?
?
我的简化xsd:


生成的wsdl:


我希望最终能够解决许多差异(不使用编码是其中之一),但最大的问题是,我的wsdl要求在请求体中使用
paymentRequest
,而原始消息只使用
payment
。事实上,反应与预期相似


我肯定有些简单的事情我忘了做/指定,所以希望你们中的一位能够为我指出正确的方向。

绑定定义有所不同。在给定的wsdl中,指定使用rpc/encoded,而在生成的wsdl文档中使用/literal。很可能您可以在生成wsdl之前设置这些设置

如果更改生成的wsdl,使其使用prc/编码,则请求如下所示:

    <SOAP-ENV:Body>
        <m:payment xmlns:m="http://xxx.yyy.com">
            <m:payment>
                <posId xsi:type="xsd:string">String</posId>
                <amountCents xsi:type="xsd:int">0</amountCents>
                <token xsi:type="m:XxxToken">
                    <tokenId xsi:type="xsd:string">String</tokenId>
                </token>
            </m:payment>
        </m:payment>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

一串

好的,在经历了大量的尝试和错误之后,我设法找到了一个不同的解决方案,用它我可以使用这些消息

我不喜欢我以前的尝试,我将
paymentRequest
重命名为
payment
,因为在查看wsdl时,我看到操作中缺少了所有“输入”部分。这感觉不太好

但是,只需指定类型

<xs:complexType name="PaymentRequest">
    <xs:sequence>
        <xs:element name="posId" type="xs:string"/>
        <xs:element name="amountCents" type="xs:int"/>
        <xs:element name="token" type="tns:XxxToken"/>
    </xs:sequence>
</xs:complexType>

元素呢

<xs:element name="paymentRequest" type ="PaymentRequest">

另外,它工作了,现在输入部分在WSDL中再次正确显示

再仔细研究一下,主要问题实际上(完全)是由原始WSDL使用RPC/encoded而不是Document/Literal(正如@martijn在他的回答中所建议的那样)引起的。事实证明,RPC/encoded实际上已经被弃用了(已经有好几年了……),而且Spring似乎不支持它


因此,除非有人知道如何让Spring使用RPC/encoded,否则我想我需要回到要求我开发一个服务器与他们的硬件通信并使他们(至少)允许文档/文字响应的公司。

知道如何指定RPC/encoded的使用吗?这会解决命名问题吗?我发现您实际上可以直接使用wsdl作为源代码。但这并不能解决我的问题,因为在wsdl中,只有三种复杂类型会生成一个类,所以我没有为实际感兴趣的消息生成一个类,我尝试了一些简单的方法并重命名了元素,因此它现在被称为just payment,而不是paymentRequest。这样就解决了命名的问题(为什么我不早点尝试呢