私はウェブサービスの世界には比較的新しいです、そして私の研究は私を啓発する以上に私を混乱させているようです。
このライブラリは他の開発者と共有され、jar内のクラスの中にはWebサービスを呼び出すメソッドを持つクラスがあります(基本的にクラスの属性を設定し、オブジェクトをdbに格納するようなビジネスロジックを行います)。など、それらの変更を加えたオブジェクトを送り返します。私はこのサービスへの呼び出しをできるだけ単純に、できればできるだけ単純にして、クラスを使用する開発者が実行するだけでよいようにしたいと思います。
Car c = new Car("Blue");
c.webmethod();
私はJAX-WSをサーバ上で使用することを検討してきましたが、サーバにwsimport
を作成する必要もクライアントにもwsimport
を作成する必要はないように思われます。サーバーとクライアントの両方で共有されているクラス間。 Webサービスとコールをクラスで行うことがどのように意味があると思いますか。
私はあなたの問題がJavaからSOAP(JAX-WS)Webサービスを呼び出しそしてその戻りオブジェクトを取得する方法に起因することを理解します。その場合は、2つの方法が考えられます。
wsimport
を介してJavaクラスを生成して使用します。または
最初のアプローチについて(wsimport
を使用):
私はあなたがすでにサービスの(エンティティまたは他の)ビジネスクラスを持っているのを見ます、そしてそれはwsimport
がまったく新しいクラスのセットを生成するという事実です(それはあなたがすでに持っているクラスのなんらかの複製です)。
ただし、このシナリオでは、次のいずれかしかできません。
wsimport
で生成されたコードを調整(編集)します(これは困難で、どういうわけか価値がありません - WSDLが変更されるたびに注意してください)。コードを再生成して再設定する必要があります。またはwsimport
生成クラスを破棄して使用します。 (このソリューションでは、ビジネスコードは生成されたクラスを別のアーキテクチャ層からのサービスとして「使用」できます。)2番目の方法について(カスタムSOAPクライアントを作成します):
2番目のアプローチを実装するために、あなたはしなければなりません:
Java.net.HttpUrlconnection
(およびいくつかのJava.io
処理)を通してそれを行うこともできます。古典的なJava.net.HttpUrlConnection
を使用してSOAPクライアントを作成するのはそれほど難しいことではありません(しかしそれほど単純ではありません)。そしてこのリンクで見つけることができます非常に良い開始コードです。
SAAJフレームワークを使用することをお勧めします。
Java用添付ファイルAPI(SAAJ)付きのSOAPは、Webサービスの舞台裏で発生するSOAP要求/応答メッセージを直接処理するために主に使用されます。 APIこれにより、開発者はJAX-WSを使用せずに直接SOAPメッセージを送受信できます。
SAAJを使用したSOAP Webサービス呼び出しの実用的な例(実行してください)を以下で参照してください。このWebサービスを呼び出す。
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をシリアライズ/デシリアライズに使用することについては、それに関する情報を見つけるのはとても簡単です。あなたはここから始めることができます: http://www.mkyong.com/Java/jaxb-hello-world-example/ 。
あるいは、単に Apache CXFのwsdl2Java を使用して、使用できるオブジェクトを生成します。
それはあなたが彼らのウェブサイトからダウンロードすることができるバイナリパッケージに含まれています。このようなコマンドを実行するだけです。
$ ./wsdl2Java -p com.mynamespace.for.the.api.objects -autoNameResolution http://www.someurl.com/DefaultWebService?wsdl
これは、wsdlを使ってオブジェクトを生成します。これは、 this のように使用できます(オブジェクト名もwsdlから取得されるため、オブジェクトは少し異なります)。 :
DefaultWebService defaultWebService = new DefaultWebService();
String res = defaultWebService.getDefaultWebServiceHttpSoap11Endpoint().login("webservice","dadsadasdasd");
System.out.println(res);
ソースを生成するMavenプラグインさえあります。 https://cxf.Apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-Java.html
注:CXFとIDEAを使用してソースを生成する場合は、これを確認してください。 https://stackoverflow.com/a/46812593/840315