Apache CXF dengan JAX-WS
Pada aplikasi JAX-WS ini kita akan menggunakan Apache CXF-first approach seperti pada aplikasi POJO sebelumnya. Jadi pertama-tama kita akan membuat antarmuka untuk layanan web kita.
Mendeklarasikan Antarmuka Layanan
Seperti pada kasus sebelumnya, kita akan membuat layanan sepele yang hanya memiliki satu metode antarmuka yang disebut salam. Kode untuk antarmuka layanan ditunjukkan di bawah ini -
//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;
@WebService
public interface HelloWorld {
String greetings(String text);
}
Kami membubuhi keterangan antarmuka dengan @WebServicemenandai. Selanjutnya, kami akan menerapkan antarmuka ini.
Menerapkan Antarmuka Web
Implementasi antarmuka web ditampilkan di sini -
//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
@Override
public String greetings(String name) {
return ("hi " + name);
}
}
Metode salam dianotasi dengan @Overridemenandai. Metode ini mengembalikan pesan "hai" ke pemanggil.
Selanjutnya kita akan menulis kode untuk mengembangkan server.
Mengembangkan Server
Tidak seperti aplikasi POJO, kami sekarang akan memisahkan antarmuka dengan menggunakan kelas Endpoint yang disediakan CXF untuk mempublikasikan layanan kami. Ini dilakukan dalam dua baris kode berikut -
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
"http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature()
);
Parameter pertama dari metode publish menentukan URL di mana layanan kami akan disediakan untuk klien. Parameter kedua menentukan kelas implementasi untuk layanan kami. Seluruh kode untuk server ditampilkan di bawah ini -
//Server.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
public static void main(String[] args) throws Exception {
HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish("http://localhost:9090/HelloServerPort",
implementor,
new LoggingFeature());
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
}
}
Untuk menerapkan server kami, Anda perlu melakukan beberapa modifikasi lagi pada proyek Anda seperti yang tercantum di bawah ini.
Menerapkan Server
Terakhir, untuk menerapkan aplikasi server, Anda perlu membuat satu modifikasi lagi di pom.xml untuk menyiapkan aplikasi Anda sebagai aplikasi web. Kode yang perlu Anda tambahkan ke filepom.xml diberikan di bawah -
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Sebelum Anda menerapkan aplikasi, Anda perlu menambahkan dua file lagi ke proyek Anda. Ini ditunjukkan pada gambar di bawah -
File-file ini adalah file standar CXF yang mendefinisikan pemetaan CXFServlet. Kode di dalamweb.xml file ditampilkan di sini untuk referensi cepat Anda -
//Web.xml
<?xml version = "1.0" encoding = "UTF-8"??>
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name>cxf</display-name>
<servlet>
<description>Apache CXF Endpoint</description>
<display-name>cxf</display-name>
<servlet-name>cxf</servlet-name>
<servlet-class>
org.apache.cxf.transport.servlet.CXFServlet
</servlet-class>
<load-on-startup>
1
</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>
cxf
</servlet-name>
<url-pattern>
/services/*
</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
Dalam cxf-servlet.xml,Anda mendeklarasikan properti untuk titik akhir layanan Anda. Ini ditunjukkan pada potongan kode di bawah ini -
<beans ...>
<jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
id = "helloHTTP"
address = "http://localhost:9090/HelloServerPort"
serviceName = "helloworld:HelloServiceService"
endpointName = "helloworld:HelloServicePort">
</jaxws:endpoint>
</beans>
Di sini kita mendefinisikan id untuk titik akhir layanan kita, alamat di mana layanan akan tersedia, nama layanan dan nama titik akhir. Sekarang, Anda telah mempelajari bagaimana layanan Anda dirutekan dan diproses oleh servlet CXF.
Akhir pom.xml
Itu pom.xmlmenyertakan beberapa dependensi lagi. Daripada menjelaskan semua dependensi, kami telah menyertakan versi terakhir pom.xml di bawah -
<?xml version = "1.0" encoding = "UTF-8"??>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.tutorialspoint</groupId>
<artifactId>cxf-jaxws</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<profiles>
<profile>
<id>server</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.6.0</version>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
</goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>client</id>
<build>
<defaultGoal>test</defaultGoal>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<executions>
<execution>
<phase>test</phase>
<goals>
<goal>java</goal>
<goals>
<configuration>
<mainClass>
com.tutorialspoint.cxf.jaxws.helloworld.Client
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-features-logging</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</project>
Perhatikan bahwa itu juga termasuk profil untuk membangun klien yang akan kita pelajari di bagian selanjutnya dari tutorial ini.
Menjalankan Layanan HelloWorld
Sekarang, Anda siap menjalankan aplikasi web. Di jendela perintah, jalankan skrip build menggunakan perintah berikut.
mvn clean install
mvn -Pserver
Anda akan melihat pesan berikut di konsol -
INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…
Seperti sebelumnya, Anda dapat menguji server dengan membuka URL server di browser Anda.
Karena kami tidak menentukan operasi apa pun, hanya pesan kesalahan yang dikembalikan ke browser oleh aplikasi kami.
Sekarang, coba tambahkan ?wsdl ke URL Anda dan Anda akan melihat output berikut -
Jadi aplikasi server kita berjalan seperti yang diharapkan. Anda dapat menggunakan SOAP Client sepertiPostman dijelaskan sebelumnya untuk menguji layanan Anda lebih lanjut.
Di bagian selanjutnya, kita akan belajar bagaimana menulis klien yang menggunakan layanan kita.
Mengembangkan Klien
Menulis klien dalam aplikasi CXF sama mudahnya dengan menulis server. Ini kode lengkap untuk klien -
//Client.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
public final class Client {
private static final QName SERVICE_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorld");
private static final QName PORT_NAME
= new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
"HelloWorldPort");
private Client() {
}
public static void main(String[] args) throws Exception {
Service service = Service.create(SERVICE_NAME);
System.out.println("service created");
String endpointAddress = "http://localhost:9090/HelloServerPort";
service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
endpointAddress);
HelloWorld hw = service.getPort(HelloWorld.class);
System.out.println(hw.greetings("World"));
}
}
Di sini, kami menggunakan CXF yang disediakan Servicekelas untuk mengikat ke layanan yang diketahui. Kami menyebutnyacreate metode di Servicekelas untuk mendapatkan contoh layanan. Kami menetapkan port yang dikenal dengan memanggiladdPort metode di service contoh.
Sekarang, kita siap untuk menggunakan layanan, yang kita lakukan dengan terlebih dahulu mendapatkan antarmuka layanan dengan memanggil getPort metode di servicecontoh. Akhirnya, kami menyebutnyagreetings metode untuk mencetak pesan salam di konsol.
Sekarang, karena Anda telah mempelajari dasar-dasar CXF dengan menggunakan pendekatan Apache CXF-First, Anda sekarang akan mempelajari cara menggunakan CXF dengan pendekatan WSDL-First di bab berikutnya.