Как использовать Джерси в качестве реализации 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

Я не буду вдаваться в других.

Какой-то источник вы можете посмотреть на...

Вам не нужно ничего указывать в web.xml. Определите класс активатора:

@ApplicationPath("/rest")
public class _JaxRsActivator extends javax.ws.rs.core.Application {

  static {
      //Check some system init on REST init.
      Config.initCheck();
  }
}
Другие вопросы по тегам