繁体   English   中英

如何以编程方式构造基于WSDL和Request XML的SOAP请求

How to programatically construct a SOAP request based on WSDL and Request XML

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

有一个从SOAPUI调用时可以正常工作的Web服务。

我有一个Web服务客户端,如下所示,在将SoapBodyElement混搭时返回错误。 (据说它在= D之前工作)检查代码,即调用服务时,它接收到SoapBodyElement作为参数,这就是服务失败的地方。

从WSDL中,我看到类型是anyType,因此应该构造requestbody或part(在这里我很困惑)并将其作为参数传递。

问题是,如何根据WSDL和有关正常运行请求的知识来正确生成arg?

Web服务调用

public void test() throws SOAPException {
    CCCaminhaoProxy proxyCCCaminhao = new CCCaminhaoProxy();

    DigestBO digest = BOFactory.getDigestBO();

    SOAPMessage message = MessageFactory.newInstance().createMessage();
    SOAPPart soapPart = message.getSOAPPart();
    SOAPEnvelope envelope = soapPart.getEnvelope();
    SOAPBody body = envelope.getBody();

    Name transicao = envelope.createName("Transicao");
    Name idTransacao = envelope.createName("idTransacao");
    Name numeroAgendamento = envelope.createName("numeroAgendamento");
    Name placaCarreta = envelope.createName("placaCarreta");
    Name compartimento = envelope.createName("compartimento");
    Name faseCarregamento = envelope.createName("faseCarregamento");

    SOAPBodyElement root = body.addBodyElement(transicao);

    Random r = new Random();
    String vIdTransacao = String.valueOf(Math.abs(r.nextLong()));

    root.addAttribute(idTransacao, vIdTransacao);
    root.addAttribute(numeroAgendamento, "1035622");
    root.addAttribute(placaCarreta, "KNX0002");
    root.addAttribute(compartimento, "01");
    root.addAttribute(faseCarregamento, "01");

    SOAPElement soapElement;
    try {
        soapElement = (SOAPElement) proxyCCCaminhao.digest(root);
        digest.tratarRetornoDigest(soapElement);
    } catch (ErroComunicacaoCCCaminhaoException e) {
        logger.error(null, e);
    }       
}

错误

com.domain.controleacesso.integracao.cccaminhao.ErroComunicacaoCCCaminhaoException: java.rmi.RemoteException: web service invoke failed: javax.xml.soap.SOAPException:  failed to serialize class java.lang.Objectweblogic.xml.schema.binding.SerializationException: type mapping lookup failure on class=class weblogic.xml.saaj.SOAPElementImpl TypeMapping=TYPEMAPPING SIZE=3
    ENTRY 1:
     class:    java.lang.Object
     xsd_type: ['http://www.w3.org/2001/XMLSchema']:xsd:anyType
     ser:      weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d02f37
     deser:    weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d02fa3
    ENTRY 2:
     class:    java.lang.Object
     xsd_type: ['http://xml.domain.biz/2010/scoa:changestate']:stns:digestReturn
     ser:      weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d031c4
     deser:    weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d0321d
    ENTRY 3:
     class:    java.lang.Object
     xsd_type: ['http://xml.domain.biz/2010/scoa:changestate']:stns:digest
     ser:      weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d3dff6
     deser:    weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d3e04f
    ; nested exception is: 
        javax.xml.soap.SOAPException:  failed to serialize class java.lang.Objectweblogic.xml.schema.binding.SerializationException: type mapping lookup failure on class=class weblogic.xml.saaj.SOAPElementImpl TypeMapping=TYPEMAPPING SIZE=3
    ENTRY 1:
     class:    java.lang.Object
     xsd_type: ['http://www.w3.org/2001/XMLSchema']:xsd:anyType
     ser:      weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d02f37
     deser:    weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d02fa3
    ENTRY 2:
     class:    java.lang.Object
     xsd_type: ['http://xml.domain.biz/2010/scoa:changestate']:stns:digestReturn
     ser:      weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d031c4
     deser:    weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d0321d
    ENTRY 3:
     class:    java.lang.Object
     xsd_type: ['http://xml.domain.biz/2010/scoa:changestate']:stns:digest
     ser:      weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d3dff6
     deser:    weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec@1d3e04f

请求 (通过SOAPUI发送时有效)

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:scoa="http://xml.domain.biz/2010/scoa:changestate" xmlns:chan="http://xml.domain.biz/2010/scoa/changestate">
   <soapenv:Header/>
   <soapenv:Body>
      <scoa:digest>
        <Transicao idTransacao="1541772100700" numeroAgendamento="1035622" placaCarreta="KNX0002" compartimento="01" faseCarregamento="01"/>
      </scoa:digest>
   </soapenv:Body>
</soapenv:Envelope>

WSDL

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:impl="http://xml.domain.biz/2010/scoa:changestate"
    xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:intf="http://xml.domain.biz/2010/scoa:changestate"
    targetNamespace="http://xml.domain.biz/2010/scoa:changestate">
    <wsdl:types>
        <schema xmlns="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://xml.domain.biz/2010/scoa:changestate">
            <element name="digest" type="xsd:anyType"></element>
            <element name="digestReturn" type="xsd:anyType"></element>
        </schema>
    </wsdl:types>
    <wsdl:message name="digestRequest">
        <wsdl:part element="impl:digest" name="part"></wsdl:part>
    </wsdl:message>
    <wsdl:message name="digestResponse">
        <wsdl:part element="impl:digestReturn" name="digestReturn"></wsdl:part>
    </wsdl:message>
    <wsdl:portType name="ChangeStateWS">
        <wsdl:operation name="digest">
            <wsdl:input message="impl:digestRequest" name="digestRequest"></wsdl:input>
            <wsdl:output message="impl:digestResponse" name="digestResponse"></wsdl:output>
        </wsdl:operation>
    </wsdl:portType>
    <wsdl:binding name="ChangeState.svcSoapBinding" type="impl:ChangeStateWS">
        <wsdlsoap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http"></wsdlsoap:binding>
        <wsdl:operation name="digest">
            <wsdlsoap:operation soapAction=""></wsdlsoap:operation>
            <wsdl:input name="digestRequest">
                <wsdlsoap:body use="literal"></wsdlsoap:body>
            </wsdl:input>
            <wsdl:output name="digestResponse">
                <wsdlsoap:body use="literal"></wsdlsoap:body>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="ChangeStateWSService">
        <wsdl:port name="ChangeState.svc" binding="impl:ChangeState.svcSoapBinding">
            <wsdlsoap:address
                location="http://domain.ltd/scoa/services/ChangeState.svc"></wsdlsoap:address>
        </wsdl:port>
    </wsdl:service>
</wsdl:definitions>

类型mappint

<?xml version="1.0" encoding="UTF-8"?>
<wsdd:type-mapping  xmlns:wsdd="http://www.bea.com/servers/wls70"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
 <wsdd:type-mapping-entry   class-name="java.lang.Object"
   type="xsd:anyType"
   serializer="weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec"
   deserializer="weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec">
 </wsdd:type-mapping-entry>
 <wsdd:type-mapping-entry   xmlns:stns="http://xml.domain.biz/2010/scoa:changestate"
   class-name="java.lang.Object"
   type="stns:digestReturn"
   serializer="weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec"
   deserializer="weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec">
 </wsdd:type-mapping-entry>
 <wsdd:type-mapping-entry   xmlns:stns="http://xml.domain.biz/2010/scoa:changestate"
   class-name="java.lang.Object"
   type="stns:digest"
   serializer="weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec"
   deserializer="weblogic.xml.schema.binding.internal.builtin.XSDAnyCodec">
 </wsdd:type-mapping-entry>
</wsdd:type-mapping>
1 个回复

解决方案很简单(找不到它)。

在这种情况下,问题在于使用weblogic-maven-plugin构建WS Client

<groupId>org.codehaus.mojo</groupId>
<artifactId>weblogic-maven-plugin</artifactId>

我刚刚将其升级到版本2.9.5,并相应地更改了目标

<goals>
   <goal>clientgen9</goal>
</goals>

它可以恢复原样,而无需更改原始代码。

2 使用XML而不是wsdl的PHP的SOAP请求

我正在尝试使用网络服务(瑞士邮政跟踪寄售)将Prestashop订单状态更新为交货时交货。 我收到的请求文件如下所示(.xml) 我正在尝试使用此PHP访问该文件 这将产生此错误: 我了解此问题来自以下事实:我使用的是xml文件而不是wsdl,但是无论如何我可以将这 ...

3 PHP-SOAP请求| XML / WSDL

我正在寻找一种从PHP代码发送SOAP请求的方法。 一个名为MovieStarPlanet的在线游戏,具有一个包含许多SOAP请求的“库”。 这是所有查询的链接: http://www.movi​​estarplanet.fr/WebService/ThirdParty/Thi ...

4 如何以编程方式构造NodeSeq?

我有一个像这样的NodeSeq 我想为List中的每个文章(定义为val articleList )创建此结构,结果是: 更新时间 : 请注意&lt;!-- some other markups don't know --&gt;部分,因此我不能使用XML文字语法来构造它。 ...

2011-02-13 13:36:47 5 1618   xml/ scala
5 您如何以Java编程方式加密SOAP消息?

我正在创建一个SOAPMessage对象,在发送之前,我想对内容进行加密。 我以与可以在SO上找到的许多示例类似的方式来创建它,例如: 我找不到如何加密这样创建的对象内容的示例。 ...

6 如何以编程方式(在TomEE中)获取SOAP请求的内容类型和编码?

我有一个用Java编写并部署在TomEE plus 1.7.1上的Web服务,并且存在与请求编码有关的问题,即我必须处理具有不同编码的请求,尤其是ISO-8859-1和UTF-8 。 这就是为什么我需要识别传入请求具有哪种编码的原因。 现在,我正在跟踪传入的消息: 从跟踪中可以看出, ...

8 Java-以编程方式从给定的WSDL创建SOAP

大多数Web服务都提供WSDL链接。 当您将此WSDL链接传递给Eclipse时,它将生成JAVA编码的客户端。 当您将WSDL链接传递给SOAPUI时,它将生成SOAP信封。 问题是: Java中是否有API,可以让我以编程方式生成SOAP XML? 像这样的东西: ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM