1. 소개
JAX-RS (RESTful 웹 서비스용 Java API)는 REST API 작성을 지원하는 Java API 세트입니다 . 그리고 프레임워크는 어노테이션을 잘 활용하여 이러한 API의 개발 및 배포를 단순화합니다.
이 사용방법(예제)에서는 간단한 RESTful 웹 서비스를 만들기 위해 JAX-RS 사양의 이식 가능한 구현을 제공하는 JBoss인 RESTEasy를 사용합니다.
2. 프로젝트 설정
두 가지 가능한 시나리오를 고려합니다.
- 독립 실행형 설정 - 모든 애플리케이션 서버에서 작동하도록 고안되었습니다.
- JBoss AS 설정 – JBoss AS에 배포하는 경우에만 고려
2.1. 독립형 설정
독립 실행형 설정으로 JBoss WildFly 10 을 사용하여 시작하겠습니다 .
JBoss WildFly 10은 RESTEasy 버전 3.0.11과 함께 제공되지만 보시다시피 새 3.0.14 버전으로 pom.xml 을 구성합니다.
그리고 resteasy-servlet-initializer 덕분에 RESTEasy는 ServletContainerInitializer 통합 인터페이스 를 통해 독립 실행형 Servlet 3.0 컨테이너와의 통합을 제공합니다.
pom.xml 을 살펴보겠습니다 .
<properties>
<resteasy.version>3.0.14.Final</resteasy.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
</dependency>
</dependencies>
jboss-deployment-structure.xml
JBoss 내에서 WAR, JAR 또는 EAR로 배포되는 모든 것은 모듈입니다. 이러한 모듈을 동적 모듈 이라고 합니다 .
이 외에도 $JBOSS_HOME/modules 에는 몇 가지 정적 모듈 이 있습니다 . JBoss에는 RESTEasy 정적 모듈 이 있으므로 독립 실행형 배포의 경우 일부를 제외 하려면 jboss-deployment-structure.xml 이 필수입니다.
이러한 방식으로 WAR 에 포함된 모든 클래스와 JAR 파일 이 로드됩니다.
<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="resteasy" />
</exclude-subsystems>
<exclusions>
<module name="javaee.api" />
<module name="javax.ws.rs.api"/>
<module name="org.jboss.resteasy.resteasy-jaxrs" />
</exclusions>
<local-last value="true" />
</deployment>
</jboss-deployment-structure>
2.2. 설치로서의 JBoss
JBoss 버전 6 이상에서 RESTEasy를 실행하려는 경우 애플리케이션 서버에 이미 번들로 포함된 라이브러리를 채택하도록 선택하여 pom을 단순화할 수 있습니다.
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependencies>
jboss -deployment-structure.xml 은 더 이상 필요하지 않습니다.
3. 서버 측 코드
3.1. 서블릿 버전 3 web.xml
이제 간단한 프로젝트의 web.xml을 간단히 살펴보겠습니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name>RestEasy Example</display-name>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
</web-app>
resteasy.servlet.mapping.prefix 는 API 애플리케이션에 대한 상대 경로를 추가하려는 경우에만 필요합니다.
이 시점에서 resteasy servlet-initializer 가 pom.xml 에 의존성으로 추가 되었기 때문에 web.xml 에 서블릿 을 선언하지 않았다는 점에 주목하는 것이 매우 중요합니다 . 그 이유는 – RESTEasy는 javax.server.ServletContainerInitializer 를 구현하는 org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer 클래스를 제공합니다 .
ServletContainerInitializer 는 이니셜라이저이며 서블릿 컨텍스트가 준비되기 전에 실행됩니다. 이 이니셜라이저를 사용하여 앱의 서블릿, 필터 또는 리스너를 정의할 수 있습니다.
3.2. 애플리케이션 클래스
javax.ws.rs.core.Application 클래스 는 배포에 대한 정보를 제공하기 위해 구현할 수 있는 표준 JAX-RS 클래스입니다.
@ApplicationPath("/rest")
public class RestEasyServices extends Application {
private Set<Object> singletons = new HashSet<Object>();
public RestEasyServices() {
singletons.add(new MovieCrudService());
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
보시다시피 – 이것은 단순히 모든 JAX-RS 루트 리소스 및 Provider를 나열하는 클래스이며 @ApplicationPath 어노테이션으로 어노테이션이 추가됩니다.
클래스 및 싱글톤별로 빈 세트를 리턴하면 JAX-RS 어노테이션 자원 및 제공자 클래스에 대해 WAR이 스캔됩니다.
3.3. 서비스 구현 클래스
마지막으로 여기에서 실제 API 정의를 살펴보겠습니다.
@Path("/movies")
public class MovieCrudService {
private Map<String, Movie> inventory = new HashMap<String, Movie>();
@GET
@Path("/getinfo")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Movie movieByImdbId(@QueryParam("imdbId") String imdbId) {
if (inventory.containsKey(imdbId)) {
return inventory.get(imdbId);
} else {
return null;
}
}
@POST
@Path("/addmovie")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response addMovie(Movie movie) {
if (null != inventory.get(movie.getImdbId())) {
return Response
.status(Response.Status.NOT_MODIFIED)
.entity("Movie is Already in the database.").build();
}
inventory.put(movie.getImdbId(), movie);
return Response.status(Response.Status.CREATED).build();
}
}
4. 결론
이 빠른 사용방법(예제)에서는 RESTEasy를 소개하고 매우 간단한 API를 구축했습니다.
이 문서에서 사용된 예제는 GitHub에서 샘플 프로젝트 로 사용할 수 있습니다 .