【问题标题】:What is the easiest way to wrap a Stored Procedure in a Web Service?在 Web 服务中包装存储过程的最简单方法是什么?
【发布时间】:2009-04-08 14:25:50
【问题描述】:

我们有一个旧系统,其中包含许多我们希望将其作为 Web 服务公开给其他应用程序的存储过程。我们正在使用 JBoss 构建 Web 服务。存储过程可以从 Oracle、DB2 或 MS SQL Server 数据库中运行。

JDeveloper 有一个向导来生成存根并将其部署到将在 Oracle 应用服务器 (OC4J) 上运行的 ear 文件。我们正在迁移到 JBoss 并使用 Eclipse 作为我们选择的 IDE。

我宁愿使用框架,然后自己重​​建和维护基础架构。理想情况下,我想使用开源库或 JBoss 工具/IDE 根据连接池定义和存储过程名称生成 Web 服务。

我有什么选择?

【问题讨论】:

  • 如果您是 .Net,我可以为您提供帮助... Windows Communication Foundation 非常适合此...您基本上可以通过添加一些代码将任何现有方法转换为 Web 服务。对不起,我帮不上忙!
  • 感谢猎人提供的信息。这样的产品让我觉得一定有合适的 Java 工具或库可以为 JBoss 处理这种场景。

标签: java eclipse web-services stored-procedures jboss


【解决方案1】:

如果存储过程不是为了直接公开为 Web 服务操作而编写的,那么公开它们可能是一个非常糟糕的主意。如果直接调用它们,它们可能会做出不正确的假设。

另一种方法是根据需求设计一个外部 API。如果事实证明实现一个特定操作的最佳方式是调用存储过程,那么就这样做。如果事实证明实现所有操作的最佳方式是调用现有的存储过程,那么您是对的,我只是在浪费您的时间。

但是我觉得很可能会有一些操作不是直接调用现有的存储过程来实现最好的。

【讨论】:

  • 感谢您的反馈。此要求是 JBoss 迁移项目的一部分,其中这些过程已由 Oracle 应用服务器作为 Web 服务提供。我宁愿将客户端与各种数据库需求(客户端库、连接信息...)解耦,从而使用 Web 服务。
  • 问题是,无论你如何耦合到存储过程,你仍然耦合到实现细节。我建议你不要那样做。
  • 但是耦合减少到一个点,可以在运行时更新,而不必维护客户端 jar 版本和调用该过程的 X 个客户端的连接信息。
  • 缩小了;它会更好地消除。
  • 我同意约翰,不幸的是它是我不想碰的遗留系统的一部分。
【解决方案2】:

您可能想研究 EJB 在此上下文中的使用情况。所有 J2EE 1.4 容器都应支持JSR 109,这允许将 EJB 公开为 Web 服务。

特别是,您可以将存储过程调用封装在无状态会话 EJB 中,然后将 EJB 公开为 Web 服务。

OC4J 10.1.3JBoss 4 支持这种部署模型。任何其他符合 J2EE 1.4 的容器也是如此。您只需查找有关如何重新配置​​(而不是重新编码)该容器上的应用程序的支持文档。

【讨论】:

  • +1 看起来这可能是我要采取的方法。如果我不将此标记为答案,那只是因为 zvikico 在他的帖子中提出了类似的建议。
  • 阿门。 Axis2 对我来说不是一个糟糕的选择,它只是将 EJB 公开为 Web 服务减少了必须维护的代码量。
  • 再次感谢 Vineet 的反馈
【解决方案3】:

不确定您是否能准确找到所需的内容,因此,如果无法自己编写内容,这里有两种选择:

  1. 使用将接收 SP 名称、参数并调用过程的通用 Web 服务。这对调用者不是很友好,也不是类型安全的,但它会完成工作。

  2. 使用两步法。第一步 - 将您的存储过程包装在 Java 类(POJO 或 EJB)中。第二步 - 使用非常流行、经过尝试和测试的 Apache Axis2 将类公开为 Web 服务。

我们快速搜索了this framework,用于在 EJB 中包装 SP,但我自己还没有测试过。此外,我认为一些供应商为此目的拥有专有工具。当然,这是一个简单得多的问题。

【讨论】:

  • 您好 zvikico,感谢您的链接。我们正在从 oc4j 迁移到 Jboss。我猜您链接到的框架是我试图为 JBoss 替换的包装器的外部化版本。您的选项 2 看起来更有可能,对我来说,一遍又一遍地转换所有这些 SP 似乎并不干燥
  • 选项 2 是我们确定的方法。感谢您的反馈。
【解决方案4】:

我找到了一个名为Data Services from WS02 的开源(Apache 许可)框架。有没有人试过这个?有什么建议/提示/警告吗?

【讨论】:

  • 对于我的需求来说似乎过于复杂和沉重。如果您希望管理 SOA 接口,WS02 可能是一个很好的工具。
【解决方案5】:

在 JBoss 下,公开这些服务的最简单方法是使用 EJB3 无状态会话 bean。使用此模型,您可以获得许多可以提供帮助的附加功能(资源池、事务支持等)。

@WebService
@SOAPBinding(style = Style.RPC)
public interface StoredProcedureWrapper extends Remote {
        String invokeStoredProc();
}

@Stateless
@WebService(endpointInterface = "path.to.StoredProcedureWrapper")
@Remote(StoredProcedureWrapper.class)
public class StoredProcedureWrapperBean {
        public String StoredProcedureWrapper() {
                // do business logic
                return "success";
        }
}

【讨论】:

  • 如果我当时知道这个解决方案,我可能会选择这个解决方案。感谢回复
猜你喜欢
  • 2010-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多