Como implementar o serviço RESTful do JAX-RS no framework JSF

No meu laboratório me pediram para criar um site simples usando o framework JSF e usar o REST também. Eu fiz algumas pesquisas sobre esses dois. Acontece que para REST eu tenho que usar o framework JAX-RS com Jersey. Eu queria saber como posso integrar esses dois frameworks, JAX-RS e JSF?

Eu já tenho o servlet abaixo em web.xml para JSF:

  Faces Servlet javax.faces.webapp.FacesServlet   Faces Servlet /test/*  

Para Jersey, percebi que tenho que usar o servlet abaixo em web.xml :

  Jersey REST Service org.glassfish.jersey.servlet.ServletContainer  jersey.config.server.provider.packages com.jbm.rest    Jersey REST Service /api/*  

Agora, minha preocupação é que, para mim, parece que este servlet Jersey irá replace o servlet Faces no web.xml . Isso vai mudar meu aplicativo do JSF para o JAX-RS. Mas eu quero manter o JSF e usar o JAX-RS também. Como eu posso fazer isso?

Essa preocupação é desnecessária. Você pode ter vários servlets com segurança em um único aplicativo da Web, desde que seus padrões de URL não colidam entre si. Normalmente, se esse fosse o caso, um contêiner de servlet pouco sensato já lançaria uma exceção durante a boot do webapp. No seu caso, você registrou o servlet JSF em /test/* (que é estranho, a propósito, você geralmente usa *.xhtml para isso), e você registrou o servlet JAX-RS em /api/* Então você precisa chamá-los usando URLs correspondentes a esses padrões de URL.

E, para eliminar um equívoco conceitual, você não pode e não pode “implementar o REST no JSF”. Eles são completamente independentes um do outro. Eles podem ser facilmente executados ao lado um do outro no mesmo aplicativo da Web, sem paz, sem saber uns dos outros. A única coisa que eles podem compartilhar é a camada de serviço ou os beans gerenciados ‘compartilhados’ (CDI). Mas geralmente é isso. O design da camada de serviço é, por sua vez, independente de quem está usando.

Esse problema específico não está relacionado ao JSF nem ao JAX-RS. São apenas servlets básicos . Pode valer a pena o esforço para dar um passo atrás para o básico e gastar um pouco de tempo para aprender mais sobre a pedra de construção de basicamente todas as aplicações web do Java EE.

Você não pode ter diretamente ambos na mesma class ou camada java. Eu implementei como abaixo

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

Publicando isso para qualquer um que tente fazer isso no XPages, há um Controle REST que você pode soltar na página da biblioteca de componentes.

Como a binding de um ActionListener, você vincula uma class java ao componente e define um padrão de url.

Veja esta nota: https://oliverbusse.notesx.net/hp.nsf/blogpost.xsp?documentId=2C4E

e exemplo de aplicativo https://github.com/zeromancer1972/simplerest/blob/master/ODP/XPages/index.xsp