Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不覆盖现有代码的情况下更改自顶向下的web服务_Java_Eclipse_Web Services - Fatal编程技术网

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

Java 如何在不覆盖现有代码的情况下更改自顶向下的web服务,java,eclipse,web-services,Java,Eclipse,Web Services,我对eclipse和Java开发相当陌生。如果这听起来像一个微不足道的问题,请容忍我 我正在尝试修改现有的web服务。这最初是使用自顶向下的方法开发的(即首先使用WSDL,然后生成JavaBean框架) 我已经对WSDL进行了更改,现在需要将这些更改合并到web服务中。当我右键单击WSDL生成JavaBean框架时,现有代码被覆盖。当我将首选项设置为不覆盖现有代码时,它会提示我覆盖每个文件,我不确定哪些文件应该覆盖,哪些文件不应该覆盖 有没有一种方法可以在不覆盖现有代码的情况下对其进行更改 这就

我对eclipse和Java开发相当陌生。如果这听起来像一个微不足道的问题,请容忍我

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

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

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

这就是我们应该修改现有web服务的方式吗

如果这听起来像一个微不足道的问题,请容忍我

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

这就是我们应该修改现有web服务的方式吗

嗯。。。不是真的。我会尽量提供一个一般性的解释,也许是一个可能的解决方案,为您的特殊情况,所以你请忍受我(:D),因为这将是一个漫长的职位

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

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

两者都有优点和缺点,但重要的是合同

合同 您的WSDL描述了契约。部署web服务后,合同必须保持冻结状态。合同是web服务及其客户机之间通信的基础(甚至不要让我开始)

web服务和所有客户端在其代码中实现此契约。

我已经对WSDL进行了更改

这并不总是一个好主意

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

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

合同违约变更与非违约变更 你可以在不破坏客户的情况下对合同做一些修改。例如,可以添加新操作。客户在他们的代码中不知道,他们不知道的不会伤害他们。您还可以向现有消息添加一些可选参数;由于它们是可选的,这意味着在通信时可以忽略它们,客户端代码不知道它们,不知道的不会伤害它们。这些是不间断的更改

打破改变。。。好。。。违反合同。例如,更改操作名称、更改消息参数类型或名称、添加强制参数等。客户端代码现在已被破坏。客户刚刚发现了这一点(现有代码不再有效),他们受到了伤害。此时您的web服务不再可用

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

代码 在最后一种方法中,WSDL是基于web服务代码生成的。这样做的缺点是它将代码实现与WSDL绑定。如果对代码进行更改,则可能会触发WSDL中的更改,从而在与客户达成一致的合同中进行更改

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

从WSDL生成代码 当您从WSDL生成代码时,您将获得web服务框架。这是一个样板代码,它以合同指定的SOAP格式在网络上获取web服务消息

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

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

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

在你的情况下可能的解决方案 好了,别胡扯了

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

手动执行(假设这是一个非破坏性更改)