При вызове веб-службы SOAP вы можете использовать статический или динамический вызов.
Статический вызов означает создание заглушки из WSDL и использование ее для выполнения вызова. Это создает весь «слесарный» код для вас, но тесно связан только с этим веб-сервисом, и вы не можете использовать его для других веб-сервисов с другими контрактами. Для каждого WSDL вам нужно создать еще одну заглушку.
При динамическом вызове вы читаете WSDL во время выполнения и выясняете, как вызывать веб-сервис, основываясь на информации, которую вы получаете из WSDL. Подайте ему несколько WSDL, и клиент адаптируется.
Динамический вызов - это то, что SoapUI использует для создания примеров запросов и ответов.
Он читает WSDL, который вы передаете, извлекает схему XML из раздела типов и генерирует экземпляры XML. Для этого он использует Wsdl4j и XmlBeans под капотом.
Ваше решение использовать Wsdl4j хорошее, поскольку оно дает вам контроль при разборе WSDL. Но также взгляните на XmlBeans; у него есть другие инструменты , которые могут оказаться полезными, например, схема для экземпляра класса .
Если вам нужно увидеть его в действии (возможно, отладить, чтобы увидеть, что происходит), вы можете создать быстрый грязный тест с помощью API SoapUI:
import com.eviware.soapui.impl.wsdl.WsdlInterface;
import com.eviware.soapui.impl.wsdl.WsdlProject;
import com.eviware.soapui.impl.wsdl.support.wsdl.WsdlImporter;
public class Test {
public static void main(String[] args) throws Exception {
WsdlProject project = new WsdlProject();
WsdlInterface[] wsdls = WsdlImporter.importWsdl(project, "http://www.html2xml.nl/Services/Calculator/Version1/Calculator.asmx?wsdl");
WsdlInterface wsdl = wsdls[0];
System.out.println(wsdl.getOperationByName("Add").createRequest(true));
System.exit(0); // just to clear up some threads created by the project
}
}
Сообщение, которое вы должны увидеть напечатанным (для операции Add в Calculator WS), будет выглядеть примерно так:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
<soapenv:Header/>
<soapenv:Body>
<tem:Add>
<tem:a>?</tem:a>
<tem:b>?</tem:b>
</tem:Add>
</soapenv:Body>
</soapenv:Envelope>
Надеюсь, это поможет вам выйти за пределы первого шага.