Как внедрить 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

Другие вопросы по тегам