JAX-RS를 사용하는 Apache CXF
이 장을 진행하기 전에 Java로 RESTful 웹 서비스를 작성하는 방법을 알고 있다고 가정합니다. 이 JAX-RS (RESTful 웹 서비스 용 Java API) 위에 CXF를 사용하는 방법을 보여 드리겠습니다. 최신 영화 목록을 유지하는 웹 서비스를 만들 것입니다. 사용자가 영화를 요청하면 요청에 영화 ID를 지정하면 서버가 영화를 찾아 클라이언트에 반환합니다. 사소한 경우에는 실제 바이너리 MP4 파일이 아니라 단순히 영화 이름을 클라이언트에 반환합니다. 이제 JAX-RS 애플리케이션 작성을 시작하겠습니다.
영화 요소 선언
주어진 영화의 ID와 이름을 저장하기 위해 Movie라는 XML 루트 요소를 선언합니다. 요소는 Movie.java라는 파일에서 선언됩니다. 파일의 내용은 다음과 같습니다.
//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;
}
}
사용 참고 XmlRootElement 에 대한 XML 요소를 선언하는 태그 Movie꼬리표. 다음으로, 데이터베이스에 영화 목록을 보관하는 서비스를 만듭니다.
영화 서비스 데이터베이스 생성
영화 목록을 저장하려면 Java 제공 Map키-값 쌍을 저장합니다. 목록이 크면 관리하기 쉬운 외부 데이터베이스 저장소를 사용합니다. 사소한 경우에는 데이터베이스에 5 개의 영화 만 저장합니다. MovieService 클래스의 코드는 다음과 같습니다.
//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);
}
}
다음 두 주석을 사용하여 영화 서비스의 URL 경로와 반환 유형을 지정합니다.
@Path("/movieservice/")
@Produces("text/xml")
@GET 및 @Path 주석을 사용하여 다음과 같이 GET 요청에 대한 URL을 지정합니다.
@GET
@Path("/movie/{id}/")
영화 데이터베이스 자체는 init 메서드에서 초기화되며, 여기서 데이터베이스에 영화 항목 5 개를 추가합니다.
다음 작업은 서버 애플리케이션을 작성하는 것입니다.
서버 개발
서버를 생성하려면 제공된 CXF를 사용합니다. JAXRSServerFactoryBean 수업.
JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
리소스 클래스를 설정하려면 setResourceClasses 방법.
factory.setResourceClasses(Movie.class);
factory.setResourceClasses(MovieService.class);
우리는 setResourceProvider 방법.
factory.setResourceProvider(MovieService.class,
new SingletonResourceProvider(new MovieService()));
우리는 원하는 설정 publish 전화하여 주소 aetAddress 방법-
factory.setAddress("http://localhost:9000/");
마지막으로 서버에서 create 메서드를 호출하여 factory 예.
factory.create();
서버 애플리케이션의 전체 코드는 다음과 같습니다.
//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);
}
}
최종 pom.xml
여기에 pom.xml의 최종 버전이 아래에 포함되어 있습니다.
<?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>
클라이언트 개발
RS 클라이언트를 작성하는 것은 간단합니다. URL 객체를 생성하고 스트림을 열기 만하면됩니다. CXF 제공 IOUtils 클래스를 사용하여 입력 스트림의 내용을 로컬 스트림에 복사합니다.
URL url = new URL("http://localhost:9000/movieservice/movie/1002");
try (InputStream instream = url.openStream();
CachedOutputStream outstream = new CachedOutputStream()) {
IOUtils.copy(instream, outstream);
}
클라이언트 응용 프로그램의 전체 코드는 다음과 같습니다.
//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);
}
}
}
JAX-RS 애플리케이션 테스트
명령 줄 창에서 다음 명령을 사용하여 서버를 실행하십시오-
mvn -Pserver
이제 콘솔에 다음 메시지가 표시됩니다.
INFO: Setting the server's publish address to be http://localhost:9000
이제 브라우저를 열고 다음 URL을 입력하십시오.
http://localhost:9000/movieservice/movie/1002
브라우저 창에 다음이 표시됩니다.
별도의 명령 줄 창에서 다음 명령을 실행하여 개발 한 Java 클라이언트 응용 프로그램을 사용하여 서비스를 호출 할 수 있습니다.
mvn -Pclient
다음 출력이 표시됩니다.
<?xml version="1.0" encoding = "UTF-8" standalone="yes"?>
<Movie><id>1002</id><name>Mission Imposssible</name></Movie>
CXF 샘플은 JAX-RS에서 CXF를 사용하는 방법에 대한 몇 가지 예를 제공합니다. 관심있는 독자는이 샘플을 연구하는 것이 좋습니다.