Chúng ta sử dụng tập tin WSDL để định nghĩa API specs cho SOAP Web Service. Để dễ dàng và thuận tiện trong việc implement SOAP Web Service được định nghĩa từ tập tin WSDL, các bạn có thể sử dụng JAX-WS Maven Plugin để generate các tập tin Java class cần thiết. Cụ thể như thế nào? Chúng ta hãy cùng nhau tìm hiểu trong bài viết này các bạn nhé!
Đầu tiên, mình sẽ tạo mới một Maven project:
để làm ví dụ.
Mình sẽ định nghĩa một tập tin WSDL nằm trong thư mục src/main/resources/wsdl của project với nội dung đơn giản như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
<?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://maven.huongdanjava.com/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="HelloWorldServiceService" targetNamespace="http://maven.huongdanjava.com/"> <wsdl:types> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" targetNamespace="http://maven.huongdanjava.com/" version="1.0"> <xs:element name="hello" type="tns:hello"/> <xs:element name="helloResponse" type="tns:helloResponse"/> <xs:complexType name="hello"> <xs:sequence> <xs:element minOccurs="0" name="arg0" type="xs:string"/> </xs:sequence> </xs:complexType> <xs:complexType name="helloResponse"> <xs:sequence> <xs:element minOccurs="0" name="return" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:schema> </wsdl:types> <wsdl:message name="helloResponse"> <wsdl:part element="tns:helloResponse" name="parameters"/> </wsdl:message> <wsdl:message name="hello"> <wsdl:part element="tns:hello" name="parameters"/> </wsdl:message> <wsdl:portType name="HelloWorldService"> <wsdl:operation name="hello"> <wsdl:input message="tns:hello" name="hello"/> <wsdl:output message="tns:helloResponse" name="helloResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="HelloWorldServiceServiceSoapBinding" type="tns:HelloWorldService"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="hello"> <soap:operation soapAction="" style="document"/> <wsdl:input name="hello"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="helloResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="HelloWorldServiceService"> <wsdl:port binding="tns:HelloWorldServiceServiceSoapBinding" name="HelloWorldServicePort"> <soap:address location="http://localhost:8080/hello"/> </wsdl:port> </wsdl:service> </wsdl:definitions> |
Để sử dụng JAX-WS Maven Plugin, chúng ta sẽ khai báo nó trong tập tin pom.xml như sau:
1 2 3 4 5 |
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>4.0.2</version> </plugin> |
Có nhiều goal được định nghĩa trong JAX-WS Maven Plugin như wsimport, wsgen, … nhưng để generate Java class files thì các bạn hãy sử dụng goal wsimport nhé!
Các bạn có thể định nghĩa để sử dụng goal wsimport như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>4.0.2</version> <executions> <execution> <goals> <goal>wsimport</goal> </goals> <phase>install</phase> </execution> </executions> </plugin> |
Với định nghĩa này, goal wsimport sẽ được execute khi chúng ta chạy command “mvn install” đó các bạn!
Để cấu hình sử dụng tập tin hello.wsdl mà mình đã tạo ở trên để generate Java class files, tên package và thư mục sẽ chứa các Java class files này, các bạn có thể sử dụng tag <configuration> như sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<plugin> <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-maven-plugin</artifactId> <version>4.0.2</version> <configuration> <wsdlFiles> <wsdlFile>${project.basedir}/src/main/resources/wsdl/hello.wsdl</wsdlFile> </wsdlFiles> <packageName>com.huongdanjava.soap</packageName> <sourceDestDir> ${project.basedir}/src/main/java </sourceDestDir> </configuration> <executions> <execution> <goals> <goal>wsimport</goal> </goals> <phase>install</phase> </execution> </executions> </plugin> |
Chúng ta sử dụng tag <wsdlFiles> cùng với danh sách các tag <wsdlFile> để cấu hình đường dẫn đến các tập tin WSDL mà chúng ta muốn generate các bạn nhé! Nếu các bạn muốn generate tất cả các tập tin WSDL trong một thư mục nào thì có thể sử dụng tag <wsdlDirectory> thay vì tag <wsdlFiles>, ví dụ như sau:
1 |
<wsdlDirectory>${project.basedir}/src/main/resources/wsdl</wsdlDirectory> |
Đôi khi chúng ta sẽ sử dụng tập tin WSDL từ một đường dẫn nào đó trên internet. Trong trường hợp này thì các bạn có thể sử dụng tag <wsdlUrls> cùng với danh sách các tag <wsdlUrl> để cấu hình URL trỏ tới đường dẫn đó các bạn nhé!
Chúng ta cấu hình tên package bằng tag <packageName> và thư mục chứa các tập tin được generate sử dụng tag <sourceDestDir>.
Bây giờ, nếu mình chạy command “mvn clean install” cho project ví dụ của mình, các bạn sẽ thấy kết quả như sau:
JAX-WS Maven Plugin đã generate các tập tin cần thiết để chúng ta có thể implement SOAP Web Service rồi đó các bạn!