gpt4 book ai didi

java - 如何在不覆盖现有代码的情况下更改自上而下的Web服务

转载 作者:行者123 更新时间:2023-12-04 17:03:18 24 4
gpt4 key购买 nike

我对Eclipse和Java开发相当陌生。如果这听起来像是一个琐碎的问题,请多多包涵。

我正在尝试修改现有的Web服务。它最初是使用自顶向下方法开发的(即首先使用WSDL,然后生成Java bean框架)。

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

有没有办法可以在不覆盖现有代码的情况下对其进行更改?

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

最佳答案

Please bear with me if this sounds like a trivial question.



这不是一个小问题。最简单的是您可以在网上找到的所有“Hello World” Web服务示例和教程,它们以后再也不会提供有关如何管理“Real World” Web服务的任何建议。

Is this how we should modify existing web services?



好吧...不是真的。我将尽力为您提供一般性的解释,并可能针对您的具体情况提供可能的解决方案,因此,请您耐心等待(:D),因为这将是一篇漫长的文章。

契约(Contract)第一vs契约(Contract)最后

构建Web服务时,有两种方法:首先签约和最后签约。

契约(Contract)首先意味着创建WSDL,然后生成实现WSDL规定的契约(Contract)的Java代码。契约(Contract)最后意味着创建您的Java代码,然后根据该代码生成WSDL。

两者都有优点和缺点,但重要的是契约(Contract)。

合约

您的WSDL描述了契约(Contract)。部署Web服务后,契约(Contract)必须保持冻结状态。契约(Contract)是Web服务与其客户端之间进行通信的基础(甚至不让我开始使用 web services interoperability)。

Web服务和所有客户端都在其代码中实现此契约(Contract)。

I have made changes to the WSDL...



这并不总是一个好主意。

当Web服务契约(Contract)更改时,契约(Contract)的用户可能会被破坏。更改WSDL时,将重新生成Web服务代码以支持新契约(Contract)。但是客户呢?

如果新的修改违反了契约(Contract),您将必须指示所有客户获取新的契约(Contract)并更改其代码以适应更改。您拥有多少个此Web服务的客户?您对WSDL进行了哪些更改?

契约(Contract)变更与非变更

您可以在不影响客户的情况下对契约(Contract)进行一些更改。例如,您可以添加一个新操作。客户不知道他们的代码中的内容,他们不知道的内容也不会伤害他们。您还可以在现有消息中添加一些可选参数。由于它们是可选的,这意味着可以在通信时将其省略,并且客户端代码不知道该消息,而他们不知道的消息也不会伤害他们。这些是不间断的更改。

打破变化...好吧...打破契约(Contract)。这些包括例如更改操作名称,更改消息参数类型或名称,添加必需参数等。客户端代码现已损坏。客户只是发现了这一点(现有代码不再起作用),所以他们受到了伤害。此时您的Web服务不再可用。

您在WSDL上执行了哪些类型的更改?

代码

在后契约的方法中,WSDL是基于Web服务代码生成的。这样做的缺点是将代码实现与WSDL绑定(bind)在一起。如果对代码进行更改,则可能会触发WSDL中的更改,从而触发您与客户达成的契约(Contract)中的更改。

但是,如果您以契约(Contract)优先的方式对WSDL进行了更改,然后重新生成了Web服务框架代码,则会再次更改契约(Contract)。您并没有做得更好...现在您又遇到了另一个问题。您现在再次生成的Web服务现有框架代码会如何处理?

从WSDL生成代码

从WSDL生成代码时,您将获得Web服务框架。这是样板代码,仅以契约(Contract)指定的SOAP格式在线获取Web服务消息。

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

通常,代码生成工具可以将您的框架代码拆分为一个接口(interface)和该接口(interface)的实现。 您必须放弃生成的实现,并提供自己的接口(interface)实现。您可以在其他位置提供实现,以便在生成框架代码时不会被覆盖。如果接口(interface)改变了,您的实现中将会遇到编译问题,因为它与新契约(Contract)不匹配,但是至少您仍有修改它的代码:D。

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

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

好,够杂乱的...

Is there a way I can make changes to the existing code without overwriting it?



手动执行(假设这是一个不间断的更改)!

这需要一些时间,但并不难。您将原始WSDL并在单独的文件夹Folder1中为其生成代码。使用新的WSDL并在另一个单独的文件夹Folder2中为其生成代码。对两个目录进行比较,以查看更改了哪些文件。查看文件内部。

现在您知道了如何在现有项目代码中更改代码。现在,您必须找出原始生成的代码在生成之后是否经过了某种修改。将项目文件夹与Folder1比较。

然后手动进行修改。

相反,如果这是一个不可行的更改,则可能要查看是否可以迁移客户端。如果没有,您可能必须在两个终结点上公开您的Web服务,每个终结点都有自己的WSDL契约(Contract)到同一个Web服务,并且即使有可能,也要随时间迁移客户端。

关于java - 如何在不覆盖现有代码的情况下更改自上而下的Web服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8657976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com