Java 如何在不使用代码生成器的情况下从WSDL生成具有完全填充的请求的SOAP消息

Java 如何在不使用代码生成器的情况下从WSDL生成具有完全填充的请求的SOAP消息,java,web-services,soap,wsdl,Java,Web Services,Soap,Wsdl,我想问您,如何在WSDL文件的基础上以XML格式生成SOAP请求/响应。目标平台是JVM,因此可以使用多种语言(例如Java、Scala、Groovy、JRuby、Jython等)。SOAP请求/响应生成应该完全在XML级别上完成,而不需要任何类生成和类加载(在这种情况下,WSDL2Java、JAXB或类似的方法是不合适的)。生成应该通过使用开源组件以编程方式完成。生成技术应该支持文档文字、rpc编码和rpc文字风格,因此生成器应该处理参数的正确编码。应完全填充请求/响应消息->即使对于空/空白

我想问您,如何在WSDL文件的基础上以XML格式生成SOAP请求/响应。目标平台是JVM,因此可以使用多种语言(例如Java、Scala、Groovy、JRuby、Jython等)。SOAP请求/响应生成应该完全在XML级别上完成,而不需要任何类生成和类加载(在这种情况下,WSDL2Java、JAXB或类似的方法是不合适的)。生成应该通过使用开源组件以编程方式完成。生成技术应该支持文档文字、rpc编码和rpc文字风格,因此生成器应该处理参数的正确编码。应完全填充请求/响应消息->即使对于空/空白值,也应生成空节点

长话短说->我想通过编程实现在SoapUIIDE中可以实现的事情。我已经看过不同的Java相关库/框架(SAAJ、WSDL4J)或Ruby(Savon),但我正在努力将其进一步发展

我正在处理的一个示例Web服务定义(WSDL和XSD)是
stockquote ws.wsdl
stockquote schema.xsd

我想做的是:

SoapMessageGenerator generator = new SoapMessageGenerator("stockquote-ws.wsdl");
String request = generator.generateSoapRequest();
String response = generator.generateSoapResponse();
在这种情况下,请求应如下所示:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePrice soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePriceRequest>
            <tickerSymbol xsi:type="xsd:string">?</tickerSymbol>
         </stoc1:TradePriceRequest>
      </stoc:GetLastTradePrice>
   </soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePriceResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePrice>
            <price xsi:type="xsd:float">?</price>
         </stoc1:TradePrice>
      </stoc:GetLastTradePriceResponse>
   </soapenv:Body>
</soapenv:Envelope>

?
。。。而响应应如下所示:

<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePrice soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePriceRequest>
            <tickerSymbol xsi:type="xsd:string">?</tickerSymbol>
         </stoc1:TradePriceRequest>
      </stoc:GetLastTradePrice>
   </soapenv:Body>
</soapenv:Envelope>
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stoc="http://centeractive.com/stockquote.wsdl" xmlns:stoc1="http://centeractive.com/stockquote.xsd">
   <soapenv:Header/>
   <soapenv:Body>
      <stoc:GetLastTradePriceResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
         <stoc1:TradePrice>
            <price xsi:type="xsd:float">?</price>
         </stoc1:TradePrice>
      </stoc:GetLastTradePriceResponse>
   </soapenv:Body>
</soapenv:Envelope>

?

您可能会对移动开发中使用的应用感兴趣。将向您指出如何序列化请求,下面的部分将向您展示如何获得响应

kSOAP可以创建SOAP消息,而无需生成代理代码。这在移动开发中是必需的,因为它的处理能力远远低于桌面,并且具有代理类和库被认为比直接创建SOAP消息更重

上面的文章似乎讨论了我将在您的案例中尝试的技术:使用XSLT转换。毕竟,您要从XML转换为XML。如果您比我更幸运地找到(或开发)从WSDL到伴随的SOAP请求所需的特定XSLT样式表,我很想了解它

干杯,
Wim

那么
SOAPUI
库呢:

package com.bbog.soap;

import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlOperation;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlImporter;
import com.eviware.soapui.model.iface.Operation;

public class WsdlAnalyzer {

    public static void main(String[] args) throws Exception {
        WsdlProject project = new WsdlProject();
        WsdlInterface[] wsdls = WsdlImporter.importWsdl(project, "http://localhost:7000/Solicitud?wsdl");
        WsdlInterface wsdl = wsdls[0];
        for (Operation operation : wsdl.getOperationList()) {
            WsdlOperation op = (WsdlOperation) operation;
            System.out.println("OP:"+op.getName());
            System.out.println(op.createRequest(true));
            System.out.println("Response:");
            System.out.println(op.createResponse(true));
        }
    }
}

事实上,我也希望做同样的事情。我一直在使用javax.wsdapi从wsdl中提取信息,并尝试使用javax.xml.soapapi创建soap请求/响应。它们可能值得一看。

好的。我设法完全解决了这个问题。我从soapUI中提取了一些代码,并启动了一个开源项目,以在Java中以纯XML的方式支持SOAP。类提取背后的主要原因是将负责生成SOAP消息的代码与其他与其他模块(如SOAPUI图形用户界面等)紧密耦合的SOAPUI代码分离。您可以在这里找到该项目:它不仅能够生成SOAP消息,但也提供了SOAP客户端和服务器。这里有更多详细信息:

为什么不看看SoapUI是如何实现的呢?(对源代码)我看了SoapUI源代码,这不是最好的方法。类是紧密耦合的,用户界面和业务逻辑代码是混合在一起的——根本没有分离关注点。另一件事是SoapUI代码是不完整的。我刚刚编写了一个简单的提取器来提取SoapMessageBuilder类,缺少188个类。是的,这是一个完全开源的解决方案……我发现下面的webapp对于从给定的WSDL生成示例SOAP消息非常有用。我看过kSOAP,它不是我想要的。在kSOAP中,您必须手工构建请求主体(手动插入字段)。此外,该项目似乎没有得到积极的开发。欢迎来到stackoverflow。这可能是一个评论,而不是一个答案(虽然我知道你可能还没有足够的分数发表评论)。还可以提到这需要什么库?可能在哪里下载?thnx.soapui-x.y.z.jar可以从我正在使用的站点下载,但是这段代码不会停止。我找不到任何close()方法…这个库不可用,或者它已经过时了,对吗?我无法在请求中发送参数,特别是对于java not grovy。我找不到任何明确的例子或其他东西。在子项目中有一个明确的例子叫做(惊喜,惊喜)“soap示例”。这里有Java和Groovy示例:是否有c#.net的库?@tom.bujok当我下载源代码时,我在pom.xml中得到了一个执行标记错误。