Apache CXF dengan JAX-RS
Sebelum melanjutkan ke bab ini, kami berasumsi bahwa Anda tahu cara menulis layanan web RESTful di Java. Saya akan menunjukkan cara menggunakan CXF di atas JAX-RS ini (Java API for RESTful Web Services). Kami akan membuat layanan web yang menyimpan daftar film terbaru. Ketika pengguna meminta film, dia menentukan ID film dalam permintaannya, server akan mencari film tersebut dan mengembalikannya ke klien. Dalam kasus sepele kami, kami hanya akan mengembalikan nama film ke klien dan bukan file MP4 biner yang sebenarnya. Jadi mari kita mulai membuat aplikasi JAX-RS.
Mendeklarasikan Elemen Film
Kami akan mendeklarasikan elemen root XML yang disebut Movie untuk menyimpan id dan nama untuk film tertentu. Elemen tersebut dideklarasikan dalam file bernama Movie.java. Isi file ditampilkan di sini -
//Movie.java
package com.tutorialspoint.cxf.jaxrs.movie;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "Movie")
public class Movie {
private long id;
private String name;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Perhatikan penggunaan XmlRootElement tag untuk mendeklarasikan elemen XML untuk Moviemenandai. Selanjutnya, kita akan membuat layanan yang menyimpan daftar film di database-nya.
Membuat Database Layanan Film
Untuk menyimpan daftar film kami menggunakan Java yang disediakan Mapyang menyimpan pasangan nilai kunci. Jika daftarnya besar, Anda akan menggunakan penyimpanan database eksternal yang juga akan lebih mudah untuk dikelola. Dalam kasus sepele kami, kami hanya akan menyimpan lima film di database kami. Kode untuk kelas MovieService diberikan di bawah ini -
//MovieService.java
package com.tutorialspoint.cxf.jaxrs.movie;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
@Path("/movieservice/")
@Produces("text/xml")
public class MovieService {
long currentId = 123;
Map<Long, Movie> movies = new HashMap<>();
public MovieService() {
init();
}
@GET
@Path("/movie/{id}/")
public Movie getMovie(@PathParam("id") String id) {
long idNumber = Long.parseLong(id);
return movies.get(idNumber);
}
final void init() {
Movie c1 = new Movie();
c1.setName("Aquaman");
c1.setId(1001);
movies.put(c1.getId(), c1);
Movie c2 = new Movie();
c2.setName("Mission Imposssible");
c2.setId(1002);
movies.put(c2.getId(), c2);
Movie c3 = new Movie();
c3.setName("Black Panther");
c3.setId(1003);
movies.put(c3.getId(), c3);
Movie c4 = new Movie();
c4.setName("A Star is Born");
c4.setId(1004);
movies.put(c4.getId(), c4);
Movie c5 = new Movie();
c5.setName("The Meg");
c5.setId(1005);
movies.put(c5.getId(), c5);
}
}
Perhatikan bahwa kami menggunakan dua anotasi berikut untuk menentukan jalur URL untuk layanan film kami dan jenis kembaliannya -
@Path("/movieservice/")
@Produces("text/xml")
Kami menggunakan anotasi @GET dan @Path untuk menentukan URL untuk permintaan GET sebagai berikut -
@GET
@Path("/movie/{id}/")
Database film itu sendiri diinisialisasi dalam metode init, di mana kita menambahkan lima item film ke database.
Tugas kita selanjutnya adalah menulis aplikasi server.
Mengembangkan Server
Untuk membuat server, kami menggunakan CXF yang disediakan JAXRSServerFactoryBean kelas.
JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
Kami mengatur kelas sumber dayanya dengan memanggil setResourceClasses metode.
factory.setResourceClasses(Movie.class);
factory.setResourceClasses(MovieService.class);
Kami mengatur penyedia layanan dengan memanggil setResourceProvider metode.
factory.setResourceProvider(MovieService.class,
new SingletonResourceProvider(new MovieService()));
Kami mengatur yang diinginkan publish alamat dengan memanggil aetAddress metode -
factory.setAddress("http://localhost:9000/");
Akhirnya, kami mempublikasikan server dengan memanggil metode create di factory contoh.
factory.create();
Seluruh kode untuk aplikasi server diberikan di bawah ini -
//Server.java
package com.tutorialspoint.cxf.jaxrs.movie;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
public class Server {
public static void main(String[] args) throws Exception {
JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
factory.setResourceClasses(Movie.class);
factory.setResourceClasses(MovieService.class);
factory.setResourceProvider(MovieService.class,
new SingletonResourceProvider(new MovieService()));
factory.setAddress("http://localhost:9000/");
factory.create();
System.out.println("Server ready...");
Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);
}
}
Akhir pom.xml
Di sini 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-jaxrs</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.jaxrs.movie.Server
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
</dependencies>
</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.jaxrs.movie.Client
</mainClass>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<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-transports-http-jetty</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>3.3.0</version>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>2.1.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.7</version>
</dependency>
</dependencies>
</project>
Mengembangkan Klien
Menulis klien RS itu sepele. Kami cukup membuat objek URL dan membuka alirannya. Kami menggunakan kelas IOUtils yang disediakan CXF untuk menyalin konten aliran input ke aliran lokal.
URL url = new URL("http://localhost:9000/movieservice/movie/1002");
try (InputStream instream = url.openStream();
CachedOutputStream outstream = new CachedOutputStream()) {
IOUtils.copy(instream, outstream);
}
Seluruh kode untuk aplikasi klien diberikan di bawah ini -
//Client.java
package com.tutorialspoint.cxf.jaxrs.movie;
import java.io.InputStream;
import java.net.URL;
import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
public class Client {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:9000/movieservice/movie/1002");
try (InputStream instream = url.openStream();
CachedOutputStream outstream = new CachedOutputStream()) {
IOUtils.copy(instream, outstream);
String str = outstream.getOut().toString();
System.out.println(str);
}
}
}
Menguji Aplikasi JAX-RS
Jalankan server menggunakan perintah berikut di jendela baris perintah -
mvn -Pserver
Sekarang, Anda akan melihat pesan berikut di konsol -
INFO: Setting the server's publish address to be http://localhost:9000
Sekarang, buka browser Anda dan ketik URL berikut -
http://localhost:9000/movieservice/movie/1002
Anda akan melihat yang berikut ini di jendela browser.
Anda dapat menjalankan layanan dengan menggunakan aplikasi klien Java yang telah kami kembangkan dengan menjalankan perintah berikut di jendela baris perintah terpisah.
mvn -Pclient
Anda akan melihat output berikut -
<?xml version="1.0" encoding = "UTF-8" standalone="yes"?>
<Movie><id>1002</id><name>Mission Imposssible</name></Movie>
Sampel CXF memberikan beberapa contoh tentang cara menggunakan CXF dengan JAX-RS. Pembaca yang tertarik didorong untuk mempelajari sampel ini.