2015-04-19 5 views

ответ

6

What @AlexNevidomsky wrote в своем ответе является правильным, насколько, как реализовать конфигурацию приложения без каких-либо web.xml; вы используете аннотацию @ApplicationPath на подклассе Application.

@ApplicationPath("/api") 
public class AppConfig extends Application {} 

Для получения дополнительной информации о параметрах развертывания см JAX-RS spec -> 2.3 Publication -> 2.3.2 Servlet

Так как это реализовано ...

Первые вещи первых, не все серверы Java EE с помощью Джерси. На самом деле единственные, кого я знаю, которые используют Джерси, - это Glassfish и WebLogic. JBoss использует Resteasy. Том ЭЭ использует CXF. WebSphere использует Apache Wink. Это единственные, о которых я могу думать.

Так что, я думаю, вопрос: «Как Сервер знает, как загрузить приложение JAX-RS?»

В Servlet 3.0 представлен механизм вместимости, в котором используется ServletContainerInitializer. Как это работает, когда при запуске контейнера Server/Servlet он сканирует банки для папки 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 

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

Некоторые источники, на которые вы можете посмотреть ...

+0

Итак, могу ли я удалить web.xml в проекте на Джерси? – BAE

+0

@BAE обязательно ...... –

1

В web.xml необязательно оговаривать. Определить класс активатора:

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

    static { 
     //Check some system init on REST init. 
     Config.initCheck(); 
    } 
} 
+0

Но как сервер знать, чтобы использовать Джерси? – DesirePRG

+0

Если вас интересуют технические подробности, обратите внимание, что вы определяете там путь. Итак, при первом запросе этого префикса пути происходит инициализация: контейнер сервлета вызывает ResteasyDeployment.start(). По крайней мере, это то, что делает JBoss. –

Смежные вопросы