Как развернуть приложение JAX-RS?
-
20-09-2019 - |
Вопрос
В спецификации JAX-RS 1.1 говорится на стр. 6:
Если подкласс приложения не присутствует, должен быть назван добавленным сервлетом:
javax.ws.rs.core.Application
Что такое добавленный сервлет? Может ли это быть произвольный сервлет?
Если присутствует подкласс приложения, и уже есть определенное обслуживание, которое имеет инициализацию инициализации сервлета с именем:
javax.ws.rs.Application
Опять же, что такое «сервлет» здесь?
Если присутствует подкласс приложения, который не обрабатывается существующим сервлетом, то сервлет, добавленный контейнеринитализатором, должен быть назван с полностью квалифицированным именем подкласса приложения.
Означает ли «сервлет, добавленный контейнеринициализатором», добавляется автоматически сервлеты? Как будет выглядеть конфигурация?
На данный момент я не использую ни класс приложений, ни Web.xml, и он работает (с Glassfish 3.1). Требует ли этот механизм развертывания полное сканирование пути класса, которое может быть медленным с большими библиотеками?
Как развернуть на контейнере сервлета?
В Интернете есть запутанное количество параметров конфигурации. Посмотри это Пример с контекстными параметрами в web.xml (не работает для меня!). Как предпочитает развернуть приложение JAX-RS?
Решение
Существует ряд вариантов развертывания в контейнер Java EE 6 (в частности, в реализации сервлета 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
Класс @ApplicationPath
который будет служить шаблоном URL. Я бы порекомендовал сохранить web.xml
В любом случае, потому что вам, вероятно, придется добавить другую информацию о веб -приложении в любом случае.
Если вам интересно, где servlet-class
Именно от этого автоматически добавляется окружающая среда. Вы можете получить идею, посмотрев на Сервлет 3.0 ServletContext
.
Другие советы
С было 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>
Мое восстановление выглядит как:
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;
}
}
Мой отдых выглядит как
@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>
С 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>
Как я уже сказал в комментарии выше, все зависит от основы, которую вы хотите использовать.
http://syrupsucker.blogspot.com/2008/10/deploying-jersey-in-tomcat-60.html для Джерсиhttp://syroupsucker.blogspot.com/2008/10/deploying-resteasy-in-tomcat-60.html для RESTEASY
Насколько я знаю, JAX-RS не содержит спецификации для развертывания.