Tôi hiểu vấn đề của bạn tập trung vào cách gọi một dịch vụ web SOAP (JAX-WS) từ Java và nhận đối tượng trả về của nó . Trong trường hợp đó, bạn có hai cách tiếp cận có thể:
- Tạo các lớp Java thông qua
wsimport
và sử dụng chúng; hoặc là
- Tạo một ứng dụng khách SOAP:
- Nối tiếp các tham số của dịch vụ thành XML;
- Gọi phương thức web thông qua thao tác HTTP; và
- Phân tích phản hồi XML trở lại thành một đối tượng.
Về cách tiếp cận đầu tiên (sử dụng wsimport
):
Tôi thấy bạn đã có các lớp nghiệp vụ (thực thể hoặc khác) của các dịch vụ và thực tế là nó wsimport
tạo ra một tập hợp các lớp hoàn toàn mới (đó là một bản sao nào đó của các lớp bạn đã có).
Tuy nhiên, tôi sợ, trong kịch bản này, bạn chỉ có thể:
- Điều chỉnh (chỉnh sửa)
wsimport
mã được tạo để làm cho nó sử dụng các lớp nghiệp vụ của bạn (điều này rất khó và bằng cách nào đó không có giá trị - hãy nhớ rằng mỗi khi WSDL thay đổi, bạn sẽ phải tạo lại và đọc lại mã); hoặc là
- Từ bỏ và sử dụng các
wsimport
lớp được tạo ra. (Trong giải pháp này, mã doanh nghiệp của bạn có thể "sử dụng" các lớp được tạo làm dịch vụ từ một lớp kiến trúc khác.)
Về cách tiếp cận thứ hai (tạo ứng dụng khách SOAP tùy chỉnh của bạn):
Để thực hiện phương pháp thứ hai, bạn sẽ phải:
- Thuc hien cuoc goi:
- Sử dụng khung SAAJ (SOAP với API đính kèm cho Java) (xem bên dưới, nó được phân phối với Java SE 1.6 trở lên) để thực hiện các cuộc gọi; hoặc là
- Bạn cũng có thể làm điều đó thông qua
java.net.HttpUrlconnection
(và một số java.io
xử lý).
- Biến các đối tượng thành và quay lại từ XML:
- Sử dụng khung OXM (Ánh xạ đối tượng thành XML) như JAXB để tuần tự hóa / giải tuần tự hóa XML từ / thành các đối tượng
- Hoặc, nếu bạn phải, tự tạo / phân tích cú pháp XML (đây có thể là giải pháp tốt nhất nếu đối tượng nhận được chỉ khác một chút so với đối tượng đã gửi).
Tạo một ứng dụng khách SOAP bằng cách sử dụng cổ điển java.net.HttpUrlConnection
không khó lắm (nhưng cũng không đơn giản) và bạn có thể tìm thấy trong liên kết này một mã khởi đầu rất tốt.
Tôi khuyên bạn nên sử dụng khung SAAJ:
SOAP với API đính kèm cho Java (SAAJ) chủ yếu được sử dụng để xử lý trực tiếp các thông báo Yêu cầu / Phản hồi SOAP xảy ra sau hậu trường trong bất kỳ API dịch vụ web nào. Nó cho phép các nhà phát triển trực tiếp gửi và nhận tin nhắn xà phòng thay vì sử dụng JAX-WS.
Xem bên dưới một ví dụ hoạt động (chạy nó!) Của một cuộc gọi dịch vụ web SOAP bằng SAAJ. Nó gọi dịch vụ web này .
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;
}
}
Về việc sử dụng JAXB để tuần tự hóa / giải tuần tự hóa, rất dễ dàng để tìm thấy thông tin về nó. Bạn có thể bắt đầu ở đây: http://www.mkyong.com/java/jaxb-hello-world-example/ .