Как использовать Джерси в качестве реализации JAX-RS без web.xml?
Я читал, что из Java EE6 web.xml не является обязательным. Итак, без web.xml, как я могу указать серверу приложений использовать Джерси в качестве реализации спецификации JAX-RS?
2 ответа
То, что @AlexNevidomsky написал в своем ответе, является правильным, если говорить о том, как реализовать конфигурацию приложения без web.xml; вы используете @ApplicationPath
аннотация на Application
подкласс.
@ApplicationPath("/api")
public class AppConfig extends Application {}
Для получения дополнительной информации о параметрах развертывания см. Спецификацию JAX-RS -> Публикация 2.3 -> Сервлет 2.3.2.
Или, чаще всего, с Джерси в качестве реализации, мы бы расширили ResourceConfig
(который расширяет Application
).
@ApplicationPath("api")
public class AppConfig extends ResourceConfig {
public AppConfig() {
packages("package.to.scan");
}
}
Так как это реализовано...
Перво-наперво, не все серверы Java EE используют Jersey. На самом деле, я знаю, что использую Джерси только Glassfish и WebLogic. JBoss использует Resteasy. Tom EE использует CXF. WebSphere использует Apache Wink. Это единственные, о которых я могу думать.
Поэтому я думаю, что вопрос "Как Сервер знает, как загрузить приложение JAX-RS?"
Servlet 3.0 представил механизм подключаемости, который использует ServletContainerInitializer
, Как это работает, когда сервер / сервлет-контейнер запускается, он сканирует файлы JAR для META-INF/services
папка с файлом с именем javax.servlet.ServletContainerInitializer
, Этот файл должен включать одно или несколько полностью определенных имен реализаций ServletContainerInitializer
,
Этот интерфейс имеет только один метод
void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
Set<Class<?>
будет список классов, соответствующих критериям в @HandlesTypes
аннотация на ServletContainerInitializer
реализация. Если вы посмотрите на реализацию Джерси
@HandlesTypes({ Path.class, Provider.class, Application.class, ApplicationPath.class })
public final class JerseyServletContainerInitializer
implements ServletContainerInitializer {
Вы должны заметить некоторые знакомые классы аннотаций, а также Application.class
, Все эти классы, соответствующие критериям, при сканировании добавляются в Set
перешел к onStartup
метод.
Если вы отсканируете оставшуюся часть исходного кода, вы увидите, что все регистрации выполняются со всеми этими классами.
Resteasy использует
@HandlesTypes({Application.class, Path.class, Provider.class})
public class ResteasyServletInitializer implements ServletContainerInitializer
Я не буду вдаваться в других.
Какой-то источник вы можете посмотреть на...
JerseyServletContainerInitializer
исходный кодResteasyServletInitializer
исходный код- JAX-RS характеристики
Вам не нужно ничего указывать в web.xml. Определите класс активатора:
@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {
static {
//Check some system init on REST init.
Config.initCheck();
}
}