Probleminizin Java'dan bir SOAP (JAX-WS) web servisini nasıl çağıracağınıza ve geri dönen nesneyi nasıl alacağınıza bağlı olduğunu anlıyorum . Bu durumda, iki olası yaklaşımınız vardır:
- Java sınıflarını oluşturun
wsimport
ve kullanın; veya
- Şu özelliklere sahip bir SOAP istemcisi oluşturun:
- Hizmetin parametrelerini XML'e serileştirir;
- HTTP işlemiyle web yöntemini çağırır; ve
- Dönen XML yanıtını bir nesneye geri ayrıştırın.
İlk yaklaşım hakkında (kullanarak wsimport
):
Zaten hizmetlerin (varlıklar veya diğer) işletme sınıflarına sahip olduğunuzu görüyorum ve bu, wsimport
tamamen yeni bir sınıflar kümesi oluşturduğu bir gerçektir (bunlar zaten sahip olduğunuz sınıfların bir şekilde kopyalarıdır).
Korkarım ki bu senaryoda sadece şunlardan birini yapabilirsiniz:
wsimport
Oluşturulan kodu iş sınıflarınızı kullanacak şekilde uyarlayın (düzenleyin) (bu zordur ve bir şekilde buna değmez - WSDL her değiştiğinde kodu yeniden oluşturmanız ve yeniden ayarlamanız gerekeceğini unutmayın); veya
wsimport
Üretilen sınıflardan vazgeçin ve kullanın . (Bu çözümde, iş kodunuz üretilen sınıfları başka bir mimari katmandan bir hizmet olarak "kullanabilir".)
İkinci yaklaşım hakkında (özel SOAP istemcinizi oluşturun):
İkinci yaklaşımı uygulamak için yapmanız gerekenler:
- Arama yap:
- Çağrıları yapmak için SAAJ (Java için Eklentiler API'si ile SABUN) çerçevesini kullanın (aşağıya bakın, Java SE 1.6 veya üstü ile birlikte gelir); veya
- Bunu da yapabilirsiniz
java.net.HttpUrlconnection
(ve bazı java.io
işlemlerle).
- Nesneleri XML'e ve XML'den geri dönüştürün:
- XML'i nesnelerden / nesnelere seri hale getirmek / seri durumdan çıkarmak için JAXB gibi bir OXM (Nesneden XML Eşleştirmeye) çerçevesi kullanın
- Veya gerekirse, XML'yi manuel olarak oluşturun / ayrıştırın (bu, alınan nesne gönderilenden biraz farklıysa en iyi çözüm olabilir).
Classic kullanarak bir SOAP istemcisi oluşturmak java.net.HttpUrlConnection
o kadar da zor değil (ama o kadar da basit değil) ve bu bağlantıda çok iyi bir başlangıç kodu bulabilirsiniz.
SAAJ çerçevesini kullanmanızı tavsiye ederim:
Java için Eklentili SABUN (SAAJ) , esas olarak herhangi bir Web Hizmeti API'sinde perde arkasında gerçekleşen SOAP İstek / Yanıt mesajlarıyla doğrudan ilgilenmek için kullanılır. Geliştiricilerin JAX-WS kullanmak yerine doğrudan sabun mesajları gönderip almalarını sağlar.
SAAJ kullanarak bir SOAP web servis çağrısının çalışan bir örneğini (çalıştırın!) Aşağıya bakın. Bu web servisini çağırıyor .
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;
}
}
JAXB'yi serileştirme / seriyi kaldırma için kullanma hakkında, onunla ilgili bilgileri bulmak çok kolaydır. Buradan başlayabilirsiniz: http://www.mkyong.com/java/jaxb-hello-world-example/ .