Java 在Web服务中包装存储过程的最简单方法是什么?

Java 在Web服务中包装存储过程的最简单方法是什么?,java,eclipse,web-services,stored-procedures,jboss,Java,Eclipse,Web Services,Stored Procedures,Jboss,我们有一个遗留系统,其中包含许多存储过程,我们希望将这些存储过程作为web服务公开给其他应用程序。我们正在用JBoss构建web服务。存储过程可以从Oracle、DB2或MS SQL Server数据库运行 JDeveloper有一个向导来生成存根并将其部署到将在Oracle App Server(OC4J)上运行的ear文件中。我们正在迁移到JBoss并使用Eclipse作为我们的IDE选择 我宁愿使用框架,然后自己重建和维护基础设施。理想情况下,我希望使用开源库或JBoss工具/IDE根据连

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

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

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


我的选择是什么?

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

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


但是我认为可能会有一些操作不是通过直接调用现有存储过程来实现的。有人试过这个吗?有什么建议/提示/警告吗?

不确定你会找到你想要的东西,因此,如果不可能自己写东西,这里有两种选择:

  • 使用将接收SP名称、参数和调用过程的通用web服务。这对调用者不是很友好,也不是类型安全的,但它可以完成工作

  • 使用两步方法。第一步-将存储过程包装在Java类(POJO或EJB)中。第二步-使用ApacheAxis2将该类公开为web服务,ApacheAxis2非常流行、经过尝试和测试


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

    您可能希望在这种情况下调查EJB的使用情况。所有J2EE1.4容器都应该支持,这允许EJB作为web服务公开

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


    并支持这种部署模式。任何其他符合J2EE1.4的容器也会如此。您只需查找有关如何在该容器上重新配置(而不是重新编码)应用程序的支持文档。

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


    如果你是.Net,我可以帮你。。。Windows通信基金会将是完美的…您基本上可以通过添加一些代码将任何现有方法转换为Web服务。对不起,我帮不上忙!谢谢你的信息猎人。像这样的产品让我觉得一定有合适的Java工具或库可以处理JBoss的这种情况。谢谢你的反馈。此要求是JBoss迁移项目的一部分,在该项目中,Oracle App Server已将这些过程作为web服务提供。我宁愿将客户机与各种DB需求(客户机库、连接信息…)分离,从而使用web服务。问题是,无论您如何耦合到存储过程,您仍然会耦合到实现细节。我建议您不要这样做。但是耦合被减少到一个点,在运行时可以更新,而不必维护客户端jar版本和调用过程的X个客户端上的连接信息;我同意John,不幸的是,这是我不想接触的遗留系统的一部分。嗨,zvikico,谢谢你的链接。我们正在从oc4j迁移到Jboss。我猜您链接到的框架是我试图为JBoss替换的包装器的外部化版本。您的选项2看起来更有可能,只是我觉得反复转换所有这些SP并不干燥,选项2是我们确定的方法。谢谢你的反馈。看起来这可能是我要采取的方法。如果我不把这个作为答案,那只是因为兹维基科在他的博文中提出了类似的建议。Axis2对我来说不是一个坏选择,它只是将EJB作为web服务公开减少了必须维护的代码量。再次感谢您的反馈,对于我的需求来说,它似乎过于复杂和沉重。如果您希望管理SOA接口,WS02可能是一个很好的工具。如果我当时知道这个解决方案,我可能会选择它。谢谢你的回复
    @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";
            }
    }