【问题标题】:EJB module as a RESTful web service?EJB 模块作为 RESTful Web 服务?
【发布时间】:2013-06-10 13:17:47
【问题描述】:

我可以将 EJB 模块用作 RESTful Web 服务吗?

以前有关于该主题的问题,例如下面的问题,但它们是从一年到三年前。 “为什么我不能在 ejb 模块中创建 RESTful Web 服务?”

从那以后有没有升级。

【问题讨论】:

    标签: rest module ejb


    【解决方案1】:

    嗯,现在有可能(利用 CDI)。

    请参阅 JavaEE 教程here

    【讨论】:

    • 我想解释一下我正在实施什么,看看你认为哪个选项是正确的。我正在开发一个 REST Web 服务,它可以通过实体管理器访问数据库。经过大量研究,使用无状态 bean 进行多个事务是首选方案。 CDI 是更好的选择吗?
    【解决方案2】:

    是的,这可以做到。 Restful Web 服务最初是在 HTTP 的上下文中描述的,但我想它不仅限于该协议。对如何使用主要 HTTP 操作有良好的基础知识会很好。

    因此,您需要提供服务的 bean 方法遵循基本规则。

    在实现 EJB 模块的上下文中需要注意的关键事项是:

    资源

    (1) 资源是任何具有身份的东西。

    (2) 每个资源都有一个 URI。

    (3) URI 是“不透明的”,不公开其实现细节。

    资源是可以用作您服务的“货币”的任何东西。如果客户端从特定方法返回代表狗的特定表示形式的对象,他们应该能够使用该对象与可能需要代表狗的其他方法对话。如果要在多个地方使用表示狗的那个对象,那么它有一个标识符和一个获取它的方法。方法名 + 标识符 = URI(唯一资源标识符)。

    协议

    (4)GET 操作是“幂等的”,没有副作用。

    (5) 任何没有副作用的请求都应该使用 GET。

    (6) 所有交互都是无状态的。

    您可能希望以 getDog(Long dogID) 的形式实现 bean 方法。哪个是您的 dogID 标识符的狗的 URI。所有带有 getXXXX() 的方法都不会对服务的其余部分产生副作用。如果只在服务上执行getXXX(),后端不会改变一点。

    所有交互都是无状态的。所以只使用无状态 bean。

    陈述

    (7) 记录数据和元数据格式。

    (8) 数据有多种形式。

    (9) 表示包括指向其他​​资源的链接。

    因此,如果您的客户用作“货币”的狗对象上引用了所有者(最好此引用应采用标识符的形式,即 ownerID),则该标识符可用于获取完整的所有者表示使用 getOwner(ownerID),它的 URI。

    风格

    (10) 记录和宣传您的服务 API。

    (11) 使用可用的标准和技术。

    (12) 改进和扩展架构、标准和工具

    确保您的方法名称是自描述的并且自始至终是通用的。即 updateDog(Dog dog) , create(Dog dog) , deleteDog(Long dogID)。因此,如果客户端想要创建所有者,他们将立即通过资源“所有者”的名称以及在前面的示例中通过 Dog 表示中的引用获得的标识符知道方法名称是什么。

    抱歉,回答太长了。

    【讨论】:

    • @M. Ogu:感谢您的回答,您能否详细说明第 7-12 点。我将使用 JSON 和 XML。此外,我尝试了一个示例 EJB 模块,该模块公开了一种使用 REST 架构的方法。它部署到 Glassfish,但我无法通过 http 访问资源。
    • 如果您的服务客户端是其他 Java 应用程序,那么您无需担心 JSON 和 XML。如果您的客户是其他任何东西,那么您将需要一个 Web 层来提供服务。包含基于 servlet 的基础架构和 web.xml 的 Web 层。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2012-04-19
    • 1970-01-01
    相关资源
    最近更新 更多