我对eclipse和Java开发相当陌生。如果这听起来像个琐碎的问题,请耐心听我说。
我正在尝试修改一个现有的web服务。这最初是使用自顶向下的方法开发的(即WSDL首先生成Java骨架)。
我已经对WSDL进行了更改,现在需要将它们合并到web服务中。当我右键单击WSDL以生成Java框架时,现有代码将被覆盖。当我将首选项设置为不覆盖现有代码时,它会提示我覆盖每个文件,我不确定应该覆盖哪些文件,不应该覆盖哪些文件。
有什么方法可以改变现有的代码而不覆盖它呢?
这就是我们应该如何修改现有的web服务吗?
发布于 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契约,并随时间迁移客户机,如果可能的话。
https://stackoverflow.com/questions/8657976
复制相似问题