我目前正在开发一个可以通过Android应用程序或Web浏览器通过HTTP访问的Web应用程序。两个用户代理基本上提供相同的功能。 Android应用程序调用使用JAX-RS / Jersey构建的RESTful Web服务,而Web页面则是由JSF托管bean支持的Facelets。因此,我认为Web应用程序有两种可能的入口点。 Web服务执行所有必要的工作(访问资源,在DAO中执行数据库操作等),最重要的是,它们必须自行执行。因此,它们构成了一个独立的层次。
为了重用代码,从托管bean调用Web服务是一个好习惯吗?他们的生命周期是否兼容?
我们的想法是将Resource对象注入托管bean(使用CDI,但不一定),并以编程方式调用其方法。 Web服务将充当底层服务的业务代表(?)。
我广泛搜索了这个问题,但我没有得到明确的答案。我看到了托管bean使用其URL调用Web服务的一些代码片段,但由于我的所有组件都位于单个服务器应用程序中,因此我看不出是什么阻止我直接链接它们
有关错误处理的附属问题:我也对将WebApplicationExceptions从Web服务捕获到我的托管bean以将错误消息返回到视图(使用FacesMessage)的想法感到恼火。我的父亲总是告诉我,我永远不应该抓住运行时异常...所以,有没有一种好的方法来正确处理它们?
答案 0 :(得分:1)
在这种情况下,最好将业务逻辑从Web Service转换为“某些中央共享代码”。然后,Web服务和托管bean将调用共享代码。
我在引号中加上“一些中央共享代码”一词,因为你使用的内容取决于你的运行时环境。如果您正在使用像Glassfish或JBoss这样的JavaEE容器,这听起来像是完美地使用EJB和无状态会话bean(旨在确保资源得到良好管理)。您也可以使用Spring Beans作为共享代码,并以此方式集中逻辑。
这完全取决于您从开发和生产意义上看到的更舒适。但是两者都支持注入,因此Web Service和JSF Managed Beans都可以将服务注入任何其他资源。