Как внедрить JAX-RS RESTful сервис в инфраструктуру JSF
В моей лаборатории меня попросили создать простой веб-сайт с использованием JSF-фреймворка, а также использовать REST. Я провел небольшое исследование этих двух. Оказывается, для REST мне нужно использовать каркас JAX-RS с Джерси. Мне было интересно, как я могу интегрировать эти две платформы, JAX-RS и JSF?
Я уже ниже сервлет в web.xml
для JSF:
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/test/*</url-pattern>
</servlet-mapping>
Для Джерси я решил, что должен использовать приведенный ниже сервлет в web.xml
:
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.jbm.rest</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
Теперь я обеспокоен тем, что мне кажется, что этот сервлет Джерси заменит сервлет Faces в web.xml
, Это изменит мое приложение с JSF на JAX-RS. Но я хочу сохранить JSF и использовать JAX-RS. Как я могу это сделать?
3 ответа
Это беспокойство не является необходимым. Вы можете безопасно иметь несколько сервлетов в одном веб-приложении, если их шаблоны URL не конфликтуют друг с другом. Обычно, если бы это было так, контейнер с немного вменяемым сервлетом уже генерировал бы исключение во время запуска веб-приложения. В вашем случае вы зарегистрировали сервлет JSF на /test/*
(что странно, кстати, вы обычно используете *.xhtml
для этого), и вы зарегистрировали сервлет JAX-RS на /api/*
, Так что вам просто нужно вызывать их, используя URL-адреса, соответствующие этим шаблонам URL.
И, чтобы устранить концептуальное недоразумение, вы не можете и не можете "реализовать REST в JSF" вообще. Они полностью независимы друг от друга. Они могут просто спокойно запускать рядом друг с другом в одном и том же веб-приложении, не зная друг о друге. Единственное, чем они могут поделиться, - это сервисный уровень или управляемые bean-компоненты "общего доступа" (CDI). Но это обычно так. Дизайн сервисного уровня, в свою очередь, не зависит от того, кто его использует.
Эта конкретная проблема не связана ни с JSF, ни с JAX-RS. Это просто основные сервлеты. Возможно, стоит приложить усилия, чтобы сделать шаг назад к основам и потратить немного времени, чтобы больше узнать о строительном камне практически каждого веб-приложения Java EE.
Вы не можете напрямую иметь оба в одном и том же классе или слое Java. Я реализовал это, как показано ниже
|---> JSF Managed Beans(Inject logic here)
Database --> Daos --> Logic --|
|---> JAX-RS (Inject logic here)
Публикуя это для тех, кто пытается сделать это в XPages, есть элемент управления REST, который вы можете перетащить на страницу из библиотеки компонентов.
Подобно привязке ActionListener, вы связываете класс Java с компонентом и устанавливаете шаблон URL.
См. Эту заметку: https://oliverbusse.notesx.net/hp.nsf/blogpost.xsp?documentId=2C4E
и пример приложения https://github.com/zeromancer1972/simplerest/blob/master/ODP/XPages/index.xsp