Pengantar JAX-WS

1. Ikhtisar

Java API untuk XML Web Services (JAX-WS) adalah API standar untuk membuat dan menggunakan layanan web SOAP (Simple Object Access Protocol).

Pada artikel ini, kami akan membuat layanan web SOAP dan menghubungkannya menggunakan JAX-WS.

2. SABUN

SOAP adalah spesifikasi XML untuk mengirim pesan melalui jaringan. Pesan SOAP tidak bergantung pada sistem operasi apa pun dan dapat menggunakan berbagai protokol komunikasi termasuk HTTP dan SMTP.

SOAP adalah XML yang berat, karena itu paling baik digunakan dengan alat / kerangka kerja. JAX-WS adalah kerangka kerja yang menyederhanakan menggunakan SOAP. Ini adalah bagian dari Java standar.

3. Top-Down vs. Bottom-Up

Ada dua cara untuk membangun layanan web SOAP. Kita bisa pergi dengan pendekatan top-down atau pendekatan bottom-up.

Dalam pendekatan top-down (kontrak-pertama), dokumen WSDL dibuat, dan kelas Java yang diperlukan dihasilkan dari WSDL. Dalam pendekatan bottom-up (kontrak-terakhir), kelas-kelas Java ditulis, dan WSDL dihasilkan dari kelas-kelas Java.

Menulis file WSDL bisa jadi sangat sulit tergantung pada seberapa kompleks layanan web Anda. Ini membuat pendekatan bottom-up menjadi pilihan yang lebih mudah. Di sisi lain, karena WSDL Anda dibuat dari kelas Java, setiap perubahan dalam kode dapat menyebabkan perubahan pada WSDL. Ini tidak terjadi pada pendekatan top-down.

Pada artikel ini, kita akan melihat kedua pendekatan tersebut.

4. Bahasa Definisi Layanan Web (WSDL)

WSDL adalah definisi kontrak dari layanan yang tersedia. Ini adalah spesifikasi dari pesan masukan / keluaran, dan cara memanggil layanan web. Ini adalah bahasa netral dan didefinisikan dalam XML.

Mari kita lihat elemen utama dari dokumen WSDL.

4.1. Definisi

The definisi elemen elemen akar dari semua dokumen WSDL. Ini mendefinisikan nama, namespace, dll dari layanan dan, seperti yang Anda lihat, bisa sangat luas:

 ... 

4.2. Jenis

The jenis elemen mendefinisikan jenis data yang digunakan oleh layanan web. WSDL menggunakan XSD (XML Schema Definition) sebagai sistem tipe yang membantu interoperabilitas:

 ...      ... 

4.3. Pesan

The pesan elemen memberikan definisi abstrak dari data yang ditransmisikan. Setiap elemen pesan mendeskripsikan masukan atau keluaran dari metode layanan dan kemungkinan pengecualian:

 ...          ... 

4.4. Operasi dan Jenis Port

The portType elemen menjelaskan setiap operasi yang dapat dilakukan dan semua pesan elemen yang terlibat. Misalnya, operasi getEmployee menetapkan masukan , keluaran , dan kemungkinan pengecualian kesalahan yang mungkin terjadi yang dilemparkan oleh operasi layanan web :

 ...       ....  ...  

4.5. Binding

The mengikat elemen menyediakan protokol dan format data detail untuk setiap portType :

 ...               ...  ... 

4.6. Layanan dan Pelabuhan

The layanan elemen mendefinisikan port didukung oleh layanan web. The pelabuhan elemen dalam layanan mendefinisikan nama , mengikat dan alamat layanan:

 ...      ... 

5. Pendekatan Top-Down (Kontrak-Pertama)

Mari kita mulai dengan pendekatan top-down dengan membuat file WSDL employeeervicetopdown.wsdl. Demi kesederhanaan, metode ini hanya memiliki satu metode:

5.1. Menghasilkan File Sumber Layanan Web dari WSDL

Ada beberapa cara untuk menghasilkan file sumber layanan web dari dokumen WSDL.

Salah satu caranya adalah dengan menggunakan alat wsimport yang merupakan bagian dari JDK (di $ JAVA_HOME / bin) hingga JDK 8.

Dari prompt perintah:

wsimport -s . -p com.baeldung.jaxws.server.topdown employeeservicetopdown.wsdl

Opsi baris perintah yang digunakan: -p menentukan paket target. -s menentukan di mana harus meletakkan file sumber yang dihasilkan.

Untuk versi JDK selanjutnya, kita dapat menggunakan jaxws-maven-plugin oleh MojoHaus seperti yang dijelaskan di sini.

Atau, org.jvnet.jaxb2 's maven-jaxb2-plugin dapat berguna sebagai rinci dalam Menjalankan sebuah SOAP Web Service di Spring.

File yang dihasilkan:

  • EmployeeServiceTopDown.java - adalah antarmuka titik akhir layanan (SEI) yang berisi definisi metode
  • ObjectFactory.java - berisi metode pabrik untuk membuat instance kelas turunan skema secara terprogram
  • EmployeeServiceTopDown_Service.java - adalah kelas penyedia layanan yang dapat digunakan oleh klien JAX-WS.

5.2. Antarmuka Titik Akhir Layanan Web

Alat wsimport telah menghasilkan antarmuka titik akhir layanan web EmployeeServiceTopDown . Ini mendeklarasikan metode layanan web:

@WebService( name = "EmployeeServiceTopDown", targetNamespace = "//topdown.server.jaxws.baeldung.com/") @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE) @XmlSeeAlso({ ObjectFactory.class }) public interface EmployeeServiceTopDown { @WebMethod( action = "//topdown.server.jaxws.baeldung.com/" + "EmployeeServiceTopDown/countEmployees") @WebResult( name = "countEmployeesResponse", targetNamespace = "//topdown.server.jaxws.baeldung.com/", partName = "parameters") public int countEmployees(); }

5.3. Implementasi Layanan Web

Alat wsimport telah membuat struktur layanan web. Kami harus membuat implementasi layanan web:

@WebService( name = "EmployeeServiceTopDown", endpointInterface = "com.baeldung.jaxws.server.topdown.EmployeeServiceTopDown", targetNamespace = "//topdown.server.jaxws.baeldung.com/") public class EmployeeServiceTopDownImpl implements EmployeeServiceTopDown { @Inject private EmployeeRepository employeeRepositoryImpl; @WebMethod public int countEmployees() { return employeeRepositoryImpl.count(); } }

6. Pendekatan Bottom-Up (Kontrak-Terakhir)

Dalam pendekatan bottom-up, kita harus membuat antarmuka titik akhir dan kelas implementasi. WSDL dihasilkan dari kelas saat layanan web diterbitkan.

Let's create a web service that will perform simple CRUD operations on Employee data.

6.1. The Model Class

The Employee model class:

public class Employee { private int id; private String firstName; // standard getters and setters }

6.2. Web Service Endpoint Interface

The web service endpoint interface which declares the web service methods:

@WebService public interface EmployeeService { @WebMethod Employee getEmployee(int id); @WebMethod Employee updateEmployee(int id, String name); @WebMethod boolean deleteEmployee(int id); @WebMethod Employee addEmployee(int id, String name); // ... }

This interface defines an abstract contract for the web service. The annotations used:

  • @WebService denotes that it is a web service interface
  • @WebMethod is used to customize a web service operation
  • @WebResult is used to customize name of the XML element that represents the return value

6.3. Web Service Implementation

The implementation class of the web service endpoint interface:

@WebService(endpointInterface = "com.baeldung.jaxws.EmployeeService") public class EmployeeServiceImpl implements EmployeeService { @Inject private EmployeeRepository employeeRepositoryImpl; @WebMethod public Employee getEmployee(int id) { return employeeRepositoryImpl.getEmployee(id); } @WebMethod public Employee updateEmployee(int id, String name) { return employeeRepositoryImpl.updateEmployee(id, name); } @WebMethod public boolean deleteEmployee(int id) { return employeeRepositoryImpl.deleteEmployee(id); } @WebMethod public Employee addEmployee(int id, String name) { return employeeRepositoryImpl.addEmployee(id, name); } // ... }

7. Publishing the Web Service Endpoints

To publish the web services (top-down and bottom-up), we need to pass an address and an instance of the web service implementation to the publish() method of the javax.xml.ws.Endpoint class:

public class EmployeeServicePublisher { public static void main(String[] args) { Endpoint.publish( "//localhost:8080/employeeservicetopdown", new EmployeeServiceTopDownImpl()); Endpoint.publish("//localhost:8080/employeeservice", new EmployeeServiceImpl()); } }

We can now run EmployeeServicePublisher to start the web service. To make use of CDI features, the web services can be deployed as WAR file to application servers like WildFly or GlassFish.

8. Remote Web Service Client

Let's now create a JAX-WS client to connect to the EmployeeService web service remotely.

8.1. Generating Client Artifacts

To generate JAX-WS client artifacts, we can once again use the wsimport tool:

wsimport -keep -p com.baeldung.jaxws.client //localhost:8080/employeeservice?wsdl

Kelas EmployeeService_Service yang dihasilkan merangkum logika untuk mendapatkan port server menggunakan URL dan QName .

8.2. Menghubungkan ke Layanan Web

Klien layanan web menggunakan EmployeeService_Service yang dihasilkan untuk menyambung ke server dan melakukan panggilan layanan web dari jarak jauh:

public class EmployeeServiceClient { public static void main(String[] args) throws Exception { URL url = new URL("//localhost:8080/employeeservice?wsdl"); EmployeeService_Service employeeService_Service = new EmployeeService_Service(url); EmployeeService employeeServiceProxy = employeeService_Service.getEmployeeServiceImplPort(); List allEmployees = employeeServiceProxy.getAllEmployees(); } }

9. Kesimpulan

Artikel ini adalah pengenalan singkat ke layanan Web SOAP menggunakan JAX-WS .

Kami telah menggunakan pendekatan bottom-up dan top-down untuk membuat layanan Web SOAP menggunakan JAX-WS API. Kami juga telah menulis klien JAX-WS yang dapat terhubung dari jarak jauh ke server dan melakukan panggilan layanan web.

Kode sumber lengkap tersedia di GitHub.