Руководство по отдыху
1. Вступление
JAX-RS (Java API для веб-служб RESTful) - это набор Java API, который обеспечивает поддержку при созданииREST APIs. Кроме того, среда хорошо использует аннотации для упрощения разработки и развертывания этих API.
В этом руководстве мы будем использовать RESTEasy, JBoss предоставил переносимую реализацию спецификации JAX-RS, чтобы создавать простые веб-службы RESTful.
2. Настройка проекта
Мы собираемся два рассмотреть два возможных сценария:
-
Автономная установка - предназначена для работы на любом сервере приложений
-
Настройка JBoss AS - учитывать только для развертывания в JBoss AS
2.1. Автономная установка
Начнем с использованияJBoss WildFly 10 с автономной настройкой.
JBoss WildFly 10 поставляется с RESTEasy версии 3.0.11, но, как вы увидите, мы настроимpom.xml с новой версией 3.0.14.
А благодаряresteasy-servlet-initializer RESTEasy обеспечивает интеграцию с автономными контейнерамиServlet 3.0 через интерфейс интеграцииServletContainerInitializer.
Давайте посмотрим наpom.xml:__
3.0.14.Final
org.jboss.resteasy
resteasy-servlet-initializer
${resteasy.version}
org.jboss.resteasy
resteasy-client
${resteasy.version}
jboss-deployment-structure.xml
В JBoss все, что развернуто как WAR, JAR или EAR, является модулем. Эти модули обозначаются какdynamic modules.
Кроме них, в$JBOSS_HOME/modules есть еще несколько статическихmodules. Поскольку JBoss имеет RESTEasystatic modules - для автономного развертыванияjboss-deployment-structure.xml является обязательным, чтобы исключить некоторые из них.
Таким образом будут загружены все классы и файлыJAR, содержащиеся в нашемWAR:
2.2. Настройка JBoss AS
Если вы собираетесь запускать RESTEasy с JBoss версии 6 или выше, вы можете выбрать использование библиотек, уже встроенных в сервер приложений, что упрощает pom:
org.jboss.resteasy
resteasy-jaxrs
${resteasy.version}
Обратите внимание, чтоjboss-deployment-structure.xml больше не нужен.
3. Серверный код
3.1. Сервлет версии 3 web.xml
Давайте теперь быстро взглянем на web.xml нашего простого проекта:
RestEasy Example
resteasy.servlet.mapping.prefix
/rest
resteasy.servlet.mapping.prefix требуется только в том случае, если вы хотите добавить относительный путь к приложению API.
На этом этапе очень важно заметить, что мы не объявилиServlet вweb.xml, потому чтоresteasyservlet-initializer был добавлен как зависимость вpom.xml . Причина в том, что RESTEasy предоставляет классorg.jboss.resteasy.plugins.servlet.ResteasyServletInitializer, который реализуетjavax.server.ServletContainerInitializer.
ServletContainerInitializer - это инициализатор, и он выполняется до того, как любой контекст сервлета будет готов - вы можете использовать этот инициализатор для определения сервлетов, фильтров или слушателей для вашего приложения.
3.2. Класс приложения
Классjavax.ws.rs.core.Application - это стандартный класс JAX-RS, который вы можете реализовать для предоставления информации о вашем развертывании:
@ApplicationPath("/rest")
public class RestEasyServices extends Application {
private Set
Как видите, это просто класс, в котором перечислены все корневые ресурсы и поставщики JAX-RS, и он помечен аннотацией@ApplicationPath.
Если вы вернете какой-либо пустой набор для классов и синглетонов, WAR будет сканироваться на наличие ресурсов JAX-RS и классов провайдеров аннотаций.
3.3. Класс реализации служб
Наконец, давайте посмотрим здесь действительное определение API:
@Path("/movies")
public class MovieCrudService {
private Map inventory = new HashMap();
@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-интерфейс.
Пример, использованный в этой статье, доступен какsample project in GitHub.