Как развернуть приложение JAX-RS?
Спецификация JAX-RS 1.1 указана на стр. 6:
Если не присутствует подкласс приложения добавленный сервлет ДОЛЖЕН быть назван:
javax.ws.rs.core.Application
Что такое добавленный сервлет? Это может быть произвольный сервлет?
Если присутствует подкласс приложения и уже установлен сервлет который имеет инициализацию сервлета параметр с именем:
javax.ws.rs.Application
Опять же, что здесь означает "сервлет"?
Если присутствует подкласс приложения который не обрабатывается существующий сервлет, то сервлет добавлено ContainerInitializer ДОЛЖНЫ иметь имя с полным именем подкласса Application.
"Сервлет, добавленный ContainerInitializer" означает, что сервлеты автоматически добавляются? Как будет выглядеть конфигурация?
В настоящий момент я не использую ни класс Application, ни web.xml, и он работает (с GlassFish 3.1). Требуется ли для этого механизма развертывания сканирование полного класса, что может быть медленным с большими библиотеками?
Как развернуть контейнеры Servlet?
В сети существует путаное количество опций конфигурации. См. Этот пример с параметрами контекста в web.xml (не работает для меня!). Каков предпочтительный способ развертывания приложения JAX-RS?
Ответы
Ответ 1
Существует несколько вариантов развертывания в контейнере Java EE 6 (более конкретно, реализация Servlet 3.0):
Простейшим является:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Затем все классы @Path
и @Provider
, найденные в вашем веб-приложении, будут доступны в приложении JAX-RS по умолчанию с шаблоном URL сервлета "/rest/*"
.
Если у вас есть один или несколько классов, которые расширяют javax.ws.rs.core.Application
, вы можете указать так:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_3_0.xsd" version="3.0">
<servlet>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.example.jaxrs.MyApplication</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
Возможно, вы захотите сделать это выше, если хотите вернуть только определенные классы классов @Path
/@Provider
в URL-адрес (так что вы могли бы иметь второй MyApplication2 с другим шаблоном URL выше).
Вы также можете пропустить весь web.xml
и просто аннотировать свой класс MyApplication
wih @ApplicationPath
, который будет служить шаблоном URL. Я бы порекомендовал держать web.xml
в любом случае, потому что вам, вероятно, придется добавлять другую информацию о веб-приложении там в любом случае.
Если вам интересно, откуда приходит servlet-class
, он автоматически добавляется в среду. Вы можете получить представление, посмотрев на Servlet 3.0 ServletContext
.
Ответ 2
С Servlet3.0 следуйте этому. Это работает для меня.
<servlet>
<description>JAX-RS Tools Generated - Do not modify</description>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>your.restsrv.config.RESTConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<enabled>true</enabled>
<async-supported>false</async-supported>
</servlet>
<servlet>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
Ответ 3
С WAS 8.5 я меняю web.xml, чтобы добавить:
<servlet>
<servlet-class>com.ibm.websphere.jaxrs.server.IBMRestServlet</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.tada.rest.RestApplication</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
</servlet>
<servlet-mapping>
<servlet-name>javax.ws.rs.core.Application</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
My RestApplication выглядит так:
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.core.Application;
public class RestApplication extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> sets = new HashSet<Class<?>>();
sets.add(RestService.class);
return sets;
}
}
My RestService выглядит как
@Path("/tada")
public class RestService {
@GET
public String getSomething() {
return "tada";
}
}
И я добавляю в pom.xml зависимость:
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0</version>
</dependency>
Ответ 4
Как я уже сказал в комментарии выше, все зависит от структуры, которую вы хотите использовать.
http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html для Джерси
http://syrupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60.html для RESTeasy
Насколько я знаю, JAX-RS не содержит спецификации для развертывания.