2015-10-22 5 views
1

Я нашел противоречивые ответы на этот вопрос, и мне не удалось успешно запустить пример.Servlet 3.0 и JAX-RS

Может ли JAX-RS быть реализован с использованием сервлета 3.0 (в частности, Tomcat 7) с аннотациями, без необходимости использования другого контейнера сервлетов?

Если нет, объясните, почему следующая цитата из этой книги является либо неправильной, либо я интерпретирую ее неправильно.

Поскольку этот пример развертывается в сервере приложений Java EE или автономный контейнер сервлета 3.x, все, что нам нужно, это пустая web.xml файл. Сервер обнаружит, что класс приложения находится в вашей WAR и автоматически развертывает его. (RESTful Java с JAX-RS 2.0, Билл Берк)

Чтобы уточнить, что я не нужна помощь с ... Я, успешно реализован JAX-RS в Tomcat 7 с использованием Джерси web.xml, поэтому мне не нужно объяснять, как это сделать. Кроме того, я полностью осознаю, что другие Java EE/Servlet Containers (TomEE, Glassfish, Jersey, Websphere и т. Д.) - все JAX-RS знают из коробки. Мне просто нужно знать, буду ли я преследовать свой хвост, пытаясь заставить Tomcat 7 (Servlet 3.0) работать с JAX-RS без добавления контейнера сервлетов и без записей в web.xml.

ответ

3

В среде сервлетов Джерси работает как сервлет или фильтр сервлетов. Ничего подобного. Итак, как это работает, не объявляя его в web.xml? Два основных компонента этой функции

  • Программная регистрация компонентов сервлетов (то есть сервлетов и фидеров). Вы можете выполнить поиск в Google, и вы должны найти несколько примеров примеров.

  • Вставка сервлета в сервлете 3.x. Как это работает, вы реализуете ServletContainerInializer, перечислите эту реализацию в файле с именем javax.servlet.ServletContainerInializer и поместите этот файл в каталог META-INF/services фляги. Контейнер сервлета должен сканировать банки, которые ищут этот файл. Когда он находит, он видит реализацию, находит реализацию, создает ее, затем называет ее onStartup.

    Джерси имеет такую ​​реализацию SevletContainerInitializer в JerseyServletContainerInitializer. Этот класс находится в банке jersey-container-servlet. Поэтому вам нужна эта банка для этого. Если вы посмотрите на this method, это, где вы увидите программную регистрацию ServletContainer (той же самой, что йо бы объявить в web.xml

Но это еще не все. Нам все еще нужно некоторый способ настройки наше приложение, по крайней мере объявить отображение сервлета. Вот где Application класс и @ApplicationPath аннотаций приходят. Мы продлим Application класс и и аннотирование @ApplicationPath("/path") где "path" является таким же, как отображение сервлета в web.xml

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

Это стандартный JAX-RS.С Джерси обычно вместо Application класса, мы используем ResourceConfig класс (который является подклассом Application)

@ApplicationPath("/api") 
public class MyApplication extends ResourceConfig { 
    public MyApplication() { 
     packages("package.to.scan"); 
    } 
} 

Вы можете увидеть больше о вариантах развертывания Джерси в Servlet 3.x среды, here.

Следует также отметить, что Java EE-сервер имеет реализацию JAX-RS, поэтому нам нужно только добавить javaee-api jar в наше приложение в соответствии с предоставленной зависимостью. Но в контейнере сервлетов нам нужно обеспечить нашу собственную реализацию, поскольку Джерси является такой реализацией.

Если вы используете Maven, основная зависимость вам нужно это один

<dependency> 
    <groupId>org.glassfish.jersey.containers</groupId> 
    <artifactId>jersey-container-servlet</artifactId> 
    <version>${jersey2.version}</version> 
</dependency> 

Это будет тянуть кучу других банок. Вы вы не используете Maven, то вы можете скачать все банки here (the JAX-RS 2.0 RI bundle), и поместите все это в ваше приложение.

Смотрите также:

+0

Спасибо за ваше время. Я хочу знать, могу ли я развернуть это в Tomcat 7 (Servlet 3.0) без ссылок на Джерси или в web.xml. Некоторые ссылки говорят, что все, что вам нужно, это работа JAX-RS - это JavaEE OR Servlet 3.0 .... без упоминания о сервлет-контейнерах/инициализаторах (кроме javax.ws.rs.core.Application). Если в Servlet 3.0 по-прежнему требуется контейнер/инициализатор сервлетов, то книга и ссылки, которые я прочитал, являются неправильными. Вы уверены, что не относитесь к Tomcat до Servlet 3.0? –

+1

Нет, вы не можете без реализации JAX-RS. Только серверы Java EE оснащены JAX-RS. Томкат этого не делает. JAX-RS является частью спецификации Java EE. Tomcat не является сервером, совместимым с EE. Он поддерживает только части спецификации, такие как сервлеты и jsp. Другие особенности спецификации, мы должны добавить себя, такие как JAX-RS (которая сама по себе является только спецификацией), добавив ее реализацию (например, Джерси или RESTeasy). –

+0

Ok. Таким образом, в примере в книге, о котором я говорил, существует только класс, который расширяет javax.ws.rs.core.Application и классы ресурсов добавляются. Существует только пустой web.xml и без контейнеров сервлетов (т. Е. Джерси). Следующий текст приведен ниже: «Поскольку этот пример развертывается на сервере приложений Java EE или автономном контейнере Servlet 3.x, нам нужен только пустой файл web.xml. Сервер обнаружит, что класс приложения находится внутри вашей WAR и автоматически развертывать его ». В соответствии с тем, что вы мне говорите, книга неверна? –

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