如何在Java中从WSDL文件生成SOAP请求XML

4
我正在寻找某些Java开源API,可以通过传递wsdl_URL和操作名称作为参数来生成SOAP请求XML文件。实际上,SoapUI正在执行此操作,我尝试了解SoapUI源代码,但是我无法理解整个代码以完成我的任务。
是否有任何可用的Java API可以执行此操作(例如Apache)?
我在网上花了几天时间,但没有看到任何结果。
如果有人有任何想法,请帮帮我。
提前致谢。
4个回答

5
你可以使用开源的Membrane SOA库([http://www.membrane-soa.org/soa-model-doc/1.4/java-api/create-soap-request-template.htm])为WSDL中定义的每个操作生成XML。
public void createTemplates(String url){

    WSDLParser parser = new WSDLParser();
    Definitions wsdl = parser.parse(url);   
    StringWriter writer = new StringWriter();
    SOARequestCreator creator = new SOARequestCreator();
    creator.setBuilder(new MarkupBuilder(writer));
    creator.setDefinitions(wsdl);

    for (Service service : wsdl.getServices()) {
        for (Port port : service.getPorts()) {
            Binding binding = port.getBinding();
            PortType portType = binding.getPortType();
            for (Operation op : portType.getOperations()) {
                creator.setCreator(new RequestTemplateCreator());
                creator.createRequest(port.getName(), op.getName(), binding.getName());
                System.out.println(writer);
                writer.getBuffer().setLength(0);
        }
    }
}

3
Soap UI同样提供了Java API,可以从WSDL创建请求和响应XML。您可以通过访问此链接来获取相关的JAR包。
 public static void main(String[] args) throws Exception {
        WsdlProject project = new WsdlProject();
        WsdlInterface[] wsdls = WsdlImporter.importWsdl(project, "http://localhost:8080/Service?wsdl");
        WsdlInterface wsdl = wsdls[0];
        for (Operation operation : wsdl.getOperationList()) {
            WsdlOperation wsdlOperation = (WsdlOperation) operation;
            System.out.println("Request:\n"+wsdlOperation.createRequest(true));
            System.out.println("\nResponse:\n"+wsdlOperation.createResponse(true));

        }
    }

Soap UI的开发者专区为使用Soap UI Api进行集成提供了很好的指引。


2

你好,Benjamin,感谢你的回复。我没有找到任何有用的Java API来创建请求XML文件,就像在soapUI中一样。他们提到了ServiceClient类,但我不知道如何使用它。 - srini
我通常使用SOAP和Java的方式是从WSDL生成对象模型并针对其进行操作,就像这样:http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL。 - Ben
https://axis.apache.org/axis/java/user-guide.html#WSDL2Java:_Building_stubs_skeletons_and_data_types_from_WSDL - Amir Azizkhani

0
如果您有请求的SOAPHandler,您可以像这样打印您的XML:
public static String getRawXml(SOAPMessageContext context) {
        try {
            ByteArrayOutputStream byteOS = new ByteArrayOutputStream();
            context.getMessage().writeTo(byteOS);
            return byteOS.toString("UTF-8");
        } catch (SOAPException | IOException e) {
            throw new RuntimeException(e);
        }
}

并在handleMessagehandleFault中调用此方法。

另一种方式是,如果您不使用Apache或其他库来调用SOAP服务,则可以手动查看JDK中的MessageWrapper类构造函数,并在packet变量上添加断点,在调试模式下查看p.toString() :)

MessageWrapper(Packet p, Message m) {
        super(m.getSOAPVersion());
        this.packet = p;
        this.delegate = m;
        this.streamDelegate = m instanceof StreamMessage ? (StreamMessage)m : null;
        this.setMessageMedadata(p);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接