Как реализовать службу 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. Как я могу это сделать?

Ответ 1

Эта проблема не нужна. Вы можете безопасно иметь несколько сервлетов в одном веб-приложении, если их шаблоны URL не сталкиваются друг с другом. Обычно, если бы это было так, то биткарный контейнер сервлетов уже выдавал исключение во время запуска webapp. В вашем случае вы зарегистрировали сервлет JSF на /test/* (что странно, кстати, вы обычно используете *.xhtml для этого) и вы зарегистрировали сервлет JAX-RS на /api/*. Поэтому вам просто нужно вызвать их, используя URL-адреса, соответствующие этим шаблонам URL.

И, чтобы устранить концептуальное недоразумение, вы не можете и не можете "реализовать REST в JSF" вообще. Они полностью независимы друг от друга. Они могут просто легко бегать друг за другом в одном и том же веб-приложении во всем мире, не зная друг о друге. Единственное, что они могут использовать, это уровень сервиса. Но это обычно так. Дизайн служебного слоя в свою очередь не зависит от того, кто его использует.

Эта конкретная проблема не связана с JSF и JAX-RS. Это просто основные сервлеты. Возможно, стоит также попытаться сделать шаг назад к основам и потратить немного времени на узнать больше о строительном камне в основном каждое веб-приложение Java EE.

Ответ 2

Вы не можете напрямую иметь как в одном классе или слое java. Я реализовал его как ниже

                              |---> JSF Managed Beans(Inject logic here)
Database --> Daos --> Logic --|
                              |---> JAX-RS  (Inject logic here)

Ответ 3

Проводя это для тех, кто пытается это сделать в 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