Web services 从JSF托管bean调用JAX-RSWeb服务

Web services 从JSF托管bean调用JAX-RSWeb服务,web-services,jsf,rest,jax-rs,managed-bean,Web Services,Jsf,Rest,Jax Rs,Managed Bean,我目前开发了一个可以通过Android应用程序或Web浏览器通过HTTP访问的Web应用程序。两个用户代理基本上提供相同的功能。Android应用程序调用使用JAX-RS/Jersey构建的RESTful Web服务,而Web页面是由JSF管理的bean支持的Facelet。因此,我认为Web应用程序有两种可能的入口点。Web服务完成所有必要的工作(访问资源、在DAOs中执行数据库操作等),最重要的是,它们必须自己行动。因此,它们构成一个独立的层 为了重用代码,从托管bean调用Web服务是一种

我目前开发了一个可以通过Android应用程序或Web浏览器通过HTTP访问的Web应用程序。两个用户代理基本上提供相同的功能。Android应用程序调用使用JAX-RS/Jersey构建的RESTful Web服务,而Web页面是由JSF管理的bean支持的Facelet。因此,我认为Web应用程序有两种可能的入口点。Web服务完成所有必要的工作(访问资源、在DAOs中执行数据库操作等),最重要的是,它们必须自己行动。因此,它们构成一个独立的层

为了重用代码,从托管bean调用Web服务是一种好的做法吗?它们的生命周期是否兼容?

其思想是将资源对象注入托管bean(使用CDI,但不一定)并以编程方式调用其方法。Web服务将充当底层服务的业务委托(?)

我用谷歌搜索了这个问题,但没有得到明确的答案。我看到一些代码片段,其中托管bean使用其URL调用Web服务,但由于我的所有组件都位于一个服务器应用程序中,因此我看不到有什么阻止我直接链接它们


关于错误处理的辅助问题:我还对将Web服务中的WebApplicationException捕获到托管bean中以将错误消息返回到视图(使用FacesMessage)的想法感到恼火。我父亲总是告诉我永远不要捕捉运行时异常……那么,有没有正确处理它们的好方法呢

在这种情况下,您最好将业务逻辑从Web服务输出到“一些中央共享代码”中。然后,web服务和托管bean将调用共享代码

我在引号中加上了术语“一些中央共享代码”,因为您使用的代码取决于您的运行时环境。如果您使用的是像Glassfish或JBoss这样的JavaEE容器,那么这听起来像是EJB和无状态会话bean(旨在确保资源得到良好管理)的完美使用。您还可以使用Springbean作为共享代码,并以这种方式集中逻辑


这完全取决于从开发和生产的角度看,您觉得什么更舒适。但是两者都支持注入,因此Web服务和JSF管理的bean都可以将服务作为任何其他资源注入。

我同意@EdH answer。此外,对于错误处理,如果您将业务逻辑分离到一个EJB中,那么您可以在EJB中管理错误,然后登录到一个文件或其他文件中,然后只抛出一个意外异常,该异常将在JSF中始终转换为具有友好文本的同一个FacesMessage(即使使用过滤器也可以简化).实际上,我的Web应用程序部署在Tomcat servlet容器中,我不(希望)拥有所有完整的JEE堆栈,包括CDI。您的回答显然是正确的,我对此进行了验证,但我觉得它引入了一个新的重层,如果没有错误处理问题,Web服务层本可以完美地完成这项工作。所以,谢谢你,我将介绍你提到的“共享代码”…如果你不想要整个JavaEE层(尽管JavaEE的Web配置文件没有那么重),你可以引入足够的Spring来做你想做的事情。这样春天很好,你只需要带你想要的东西。