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

我对Eclipse和Java开发相当陌生。如果这听起来像是一个小问题,请忍受。

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

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

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

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

参考方案

如果这听起来像是一个小问题,请忍受。

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

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

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

合同第一vs合同最后

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

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

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

合约

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

Web服务和所有客户端均在其代码中实现此合同。

我对WSDL进行了更改...

这并不总是一个好主意。

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

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

合同变更与非变更

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

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

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

代码

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

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

从WSDL生成代码

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

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

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

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

可能的解决方案

好,够乱的...

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

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

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

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

然后手动进行修改。

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

JAVA:字节码和二进制有什么区别? - java

java字节代码(已编译的语言,也称为目标代码)与机器代码(当前计算机的本机代码)之间有什么区别?我读过一些书,他们将字节码称为二进制指令,但我不知道为什么。 参考方案 字节码是独立于平台的,在Windows中运行的编译器编译的字节码仍将在linux / unix / mac中运行。机器代码是特定于平台的,如果在Windows x86中编译,则它将仅在Win…

java:继承 - java

有哪些替代继承的方法? java大神给出的解决方案 有效的Java:偏重于继承而不是继承。 (这实际上也来自“四人帮”)。他提出的理由是,如果扩展类未明确设计为继承,则继承会引起很多不正常的副作用。例如,对super.someMethod()的任何调用都可以引导您通过未知代码的意外路径。取而代之的是,持有对本来应该扩展的类的引用,然后委托给它。这是与Eric…

Java:BigInteger,如何通过OutputStream编写它 - java

我想将BigInteger写入文件。做这个的最好方式是什么。当然,我想从输入流中读取(使用程序,而不是人工)。我必须使用ObjectOutputStream还是有更好的方法?目的是使用尽可能少的字节。谢谢马丁 参考方案 Java序列化(ObjectOutputStream / ObjectInputStream)是将对象序列化为八位字节序列的一种通用方法。但…

Java DefaultSslContextFactory密钥库动态更新 - java

我有一个使用org.restlet.engine.ssl.DefaultSslContextFactory的现有应用程序和一个在服务器启动时加载的密钥库文件。我有另一个应用程序,该应用程序创建必须添加的证书服务器运行时动态地更新到密钥库文件。为此,我在代码中创建了证书和私钥,然后将其写入到目录。该目录由bash脚本监视,该脚本检查是否有新文件,如果出现,它将…

Java-如何将此字符串转换为日期? - java

我从服务器收到此消息,我不明白T和Z的含义,2012-08-24T09:59:59Z将此字符串转换为Date对象的正确SimpleDateFormat模式是什么? java大神给出的解决方案 这是ISO 8601标准。您可以使用SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM…