首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在不覆盖现有代码的情况下更改自顶向下的web服务

如何在不覆盖现有代码的情况下更改自顶向下的web服务
EN

Stack Overflow用户
提问于 2011-12-28 15:46:53
回答 1查看 4K关注 0票数 5

我对eclipse和Java开发相当陌生。如果这听起来像个琐碎的问题,请耐心听我说。

我正在尝试修改一个现有的web服务。这最初是使用自顶向下的方法开发的(即WSDL首先生成Java骨架)。

我已经对WSDL进行了更改,现在需要将它们合并到web服务中。当我右键单击WSDL以生成Java框架时,现有代码将被覆盖。当我将首选项设置为不覆盖现有代码时,它会提示我覆盖每个文件,我不确定应该覆盖哪些文件,不应该覆盖哪些文件。

有什么方法可以改变现有的代码而不覆盖它呢?

这就是我们应该如何修改现有的web服务吗?

EN

回答 1

Stack Overflow用户

发布于 2012-01-01 16:25:45

如果这听起来像个琐碎的问题,请耐心听我说。

这不是一个微不足道的问题。琐碎的是所有的"Hello“web服务示例和教程,您可以在web上找到它们,它们不会在以后提供任何关于如何管理”真实世界“web服务的建议。

这就是我们应该如何修改现有的web服务吗?

好吧..。不怎么有意思。我将试图提供一个一般性的解释,也许是一个可能的解决方案,为您的具体情况,所以请您容忍我(:D),因为这将是一个长篇文章。

第一合同与最后合同

在构建web服务时,有两种方法:合同优先和最后契约。

契约首先意味着创建WSDL,然后生成实现WSDL规定的契约的Java代码。最后一条合同意味着创建Java代码,然后根据代码生成WSDL。

两者都有优点和缺点,但在这两者中最重要的是合同。

合同

您的WSDL描述了契约。部署web服务后,合同必须保持冻结状态。该合同是web服务与其客户端之间通信的基础(甚至不让我开始使用web服务互操作性)。

web服务和所有客户端在他们的代码.中实现了这个契约。

我已经对WSDL做了更改..。

这并不总是个好主意。

当web服务合同发生更改时,合同的用户可能会被破坏。当您更改WSDL时,您将重新生成web服务代码以支持新的契约。但客户呢?

如果新的修改违反了合同,则必须指示所有客户端获取新合同,并更改其代码以适应更改。你的这个网络服务有多少个客户?您对WSDL做了哪些更改?

违约变更与非违约变更

你可以在不破坏客户的情况下对合同做一些修改。例如,可以添加一个新操作。客户在他们的代码中不知道这一点,而他们不知道的东西也不会伤害到他们。您还可以向现有消息中添加一些可选参数;因为它们是可选的,这意味着在通信时可以省略这些参数,并且客户端代码不知道这些参数,而它们不知道的内容不会对它们造成伤害。这些都是不变的变化。

彻底改变..。好吧..。违反合同。例如,更改操作名称、更改消息参数类型或名称、添加强制参数等。客户端代码现在已中断。客户刚刚发现(现有代码不再起作用),他们就会受到伤害。此时,您的web服务不再可用。

您对WSDL执行了什么类型的更改?

密码

在契约-最后的方法中,WSDL是基于web服务代码生成的。这有一个缺点,就是它将代码实现与WSDL联系起来。如果对代码进行更改,可能会触发WSDL中的更改,因此在与客户端达成的协议中也会发生更改。

但是,如果在契约优先方法中,您对WSDL进行更改,然后重新生成web服务框架代码,那么您将再次更改合同。你没有做得更好..。现在你又遇到了另一个问题。您现在再次生成的web服务现有框架代码发生了什么变化?

从WSDL生成代码

当您从WSDL生成代码时,您将得到web服务框架。这是样板代码,它将您的web服务消息以协议指定的SOAP格式在线路上获取。

通常,您将生成此代码并将其包含到项目中,供“重要”web服务代码使用,该代码实际上提供了“服务”。如何使用这段代码很重要。在不覆盖现有代码的情况下,您必须考虑以后再次生成代码的情况。

通常,代码生成工具可以将框架代码拆分为接口和该接口的实现。必须放弃生成的实现,并提供自己的接口实现。您可以在不同的地方提供实现,以便在生成框架代码时不会覆盖它。当然,如果接口发生变化,您的实现中就会出现编译问题,因为它与新的约定不匹配,但至少您还有修改它的代码:D。

不幸的是,这不是在大多数项目中发生的情况。人们直接修改生成的实现,当他们再次生成框架时,他们会释放所有添加的代码。大多数生成工具在代码中插入一个警告:“这是计算机生成的代码。如果再次生成此代码,所有更改都将丢失.”或者类似的东西,但人们会听吗?

在您的情况下可能的解决方案

好吧,听够了.

是否有一种方法可以对现有代码进行更改而不覆盖它?

手动执行它(假设这是一个不破坏的更改)!

这需要一些时间,但也不难做到。您可以获取原始的WSDL,并在一个单独的文件夹中为它生成代码: Folder1。获取新的WSDL并在另一个单独的文件夹中为其生成代码: Folder2。对这两个目录进行区分,以查看哪些文件更改。看看里面的文件。

现在您已经知道如何在现有的项目代码中更改您的代码。现在,您必须了解最初生成的代码是否在生成后以某种方式进行了修改。将项目文件夹与Folder1进行比较。

然后用手做修改。

相反,如果这是一个易碎的更改,您可能想看看是否可以迁移客户机。如果没有,您可能必须在两个端点上公开您的web服务,每个端点都有自己的WSDL契约,并随时间迁移客户机,如果可能的话。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8657976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档