Saya memahami masalah Anda bermuara pada bagaimana memanggil layanan web SOAP (JAX-WS) dari Java dan mendapatkan objeknya kembali . Dalam hal ini, Anda memiliki dua kemungkinan pendekatan:
- Hasilkan kelas-kelas Java melalui
wsimport
dan gunakan mereka; atau
- Buat klien SOAP yang:
- Menyerialisasikan parameter layanan ke XML;
- Memanggil metode web melalui manipulasi HTTP; dan
- Parsing respons XML yang kembali menjadi objek.
Tentang pendekatan pertama (menggunakan wsimport
):
Saya melihat Anda sudah memiliki kelas bisnis layanan (entitas atau lainnya), dan itu adalah fakta bahwa wsimport
menghasilkan serangkaian kelas yang sama sekali baru (yang entah bagaimana merupakan duplikat dari kelas yang sudah Anda miliki).
Saya khawatir, dalam skenario ini, Anda hanya dapat:
- Sesuaikan (edit)
wsimport
kode yang dihasilkan untuk membuatnya menggunakan kelas bisnis Anda (ini sulit dan entah bagaimana tidak sepadan - ingatlah setiap kali WSDL berubah, Anda harus membuat ulang dan menyesuaikan kembali kode tersebut); atau
- Menyerah dan menggunakan
wsimport
kelas yang dihasilkan. (Dalam solusi ini, kode bisnis Anda dapat "menggunakan" kelas yang dihasilkan sebagai layanan dari lapisan arsitektur lain.)
Tentang pendekatan kedua (buat klien SOAP kustom Anda):
Untuk menerapkan pendekatan kedua, Anda harus:
- Lakukan panggilan:
- Gunakan kerangka kerja SAAJ (SOAP dengan Lampiran API untuk Java) (lihat di bawah, dikirimkan dengan Java SE 1.6 atau lebih tinggi) untuk melakukan panggilan; atau
- Anda juga dapat melakukannya melalui
java.net.HttpUrlconnection
(dan beberapa java.io
penanganan).
- Ubah objek menjadi dan kembali dari XML:
- Gunakan kerangka kerja OXM (Object to XML Mapping) seperti JAXB untuk membuat serial / deserialisasi XML dari / menjadi objek
- Atau, jika Anda harus, buat / parsing XML secara manual (ini bisa menjadi solusi terbaik jika objek yang diterima hanya sedikit berbeda dari yang dikirim).
Membuat klien SOAP menggunakan klasik java.net.HttpUrlConnection
tidaklah sulit (tetapi juga tidak sesederhana itu), dan Anda dapat menemukan di tautan ini kode awal yang sangat baik.
Saya sarankan Anda menggunakan kerangka SAAJ:
SOAP dengan Attachments API for Java (SAAJ) terutama digunakan untuk menangani langsung dengan pesan SOAP Request / Response yang terjadi di balik layar dalam Web Service API. Ini memungkinkan pengembang untuk langsung mengirim dan menerima pesan sabun daripada menggunakan JAX-WS.
Lihat di bawah ini contoh kerja (jalankan!) Dari panggilan layanan web SOAP menggunakan SAAJ. Itu menyebut layanan web ini .
import javax.xml.soap.*;
public class SOAPClientSAAJ {
// SAAJ - SOAP Client Testing
public static void main(String args[]) {
/*
The example below requests from the Web Service at:
https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit
To call other WS, change the parameters below, which are:
- the SOAP Endpoint URL (that is, where the service is responding from)
- the SOAP Action
Also change the contents of the method createSoapEnvelope() in this class. It constructs
the inner part of the SOAP envelope that is actually sent.
*/
String soapEndpointUrl = "https://www.w3schools.com/xml/tempconvert.asmx";
String soapAction = "https://www.w3schools.com/xml/CelsiusToFahrenheit";
callSoapWebService(soapEndpointUrl, soapAction);
}
private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException {
SOAPPart soapPart = soapMessage.getSOAPPart();
String myNamespace = "myNamespace";
String myNamespaceURI = "https://www.w3schools.com/xml/";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);
/*
Constructed SOAP Request Message:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myNamespace="https://www.w3schools.com/xml/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<myNamespace:CelsiusToFahrenheit>
<myNamespace:Celsius>100</myNamespace:Celsius>
</myNamespace:CelsiusToFahrenheit>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
*/
// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("CelsiusToFahrenheit", myNamespace);
SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Celsius", myNamespace);
soapBodyElem1.addTextNode("100");
}
private static void callSoapWebService(String soapEndpointUrl, String soapAction) {
try {
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// Send SOAP Message to SOAP Server
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl);
// Print the SOAP Response
System.out.println("Response SOAP Message:");
soapResponse.writeTo(System.out);
System.out.println();
soapConnection.close();
} catch (Exception e) {
System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
e.printStackTrace();
}
}
private static SOAPMessage createSOAPRequest(String soapAction) throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
createSoapEnvelope(soapMessage);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", soapAction);
soapMessage.saveChanges();
/* Print the request message, just for debugging purposes */
System.out.println("Request SOAP Message:");
soapMessage.writeTo(System.out);
System.out.println("\n");
return soapMessage;
}
}
Tentang penggunaan JAXB untuk serialisasi / deserialisasi, sangat mudah untuk menemukan informasi tentangnya. Anda dapat mulai di sini: http://www.mkyong.com/java/jaxb-hello-world-example/ .