如何处理版本化 SOAP Web 服务的代码?

2022-09-03 02:53:49

背景:

  • 我们的网络服务是公司内部的,但有许多不同的系统使用它们
  • 我们将努力尽可能多地弃用/删除API的旧版本

有很多关于 Web 服务版本控制的信息,我们的决定是使用以下方法来对 Web 服务进行版本控制:

  • 在URL中保留版本(我知道有些人反对这一点,但主要是关于REST服务)
  • 将版本保留在命名空间中。

但是,现在我们正在决定如何实际实现这一点,在这里我们没有找到太多最佳实践的信息。我们使用(Java):

  • 用于定义我们的 Web 服务(和 Web 服务 API)的注释
  • 使用 XML 注释注释的 POJO 豆,用于定义内容
  • 用于从/到业务层和 Web 服务 pojo 的转换器类
  • 春天

因此,要将旧版本保留在 Web 服务上,我们需要保留旧版本的代码。为此,我们基本上研究了两种不同的方法:

1)对于每个新版本,制作相关代码的完整新副本

此方法如下所示:

com.company.webservice.v3. -all of the web service classes, POJO’s and converters go here
com.company.webservice.v4. -all of the web service classes, POJO’s and converters go here

因此,在这里我们复制了代码。简而言之,我们的想法是:

  • 代码重复。将是具有相同代码的多个类。也许在Eclipse中令人困惑。
  • 完全隔离,易于确定特定版本的构成
  • 将影响以前版本服务功能的风险降至最低

2)使用spring只制作受更改影响的每个类的副本

这种方法意味着使用Spring IoC并让所有版本的Web服务尽可能多地使用相同的代码。只有当我们做出影响行为/api的更改时,我们才会制作这些类的新版本。例如:

com.company.webservice.beans.MyXMLAnnotatedPOJOv3.java
com.company.webservice.beans.MyXMLAnnotatedPOJOv4.java
com.company.webservice.translators.MyXTranslatorv1.java
com.company.webservice.translators.MyXTranslatorv2.java
  • 可能很难清楚地看到 Web 服务的特定版本构成。在维护代码时,可能更容易通过错过影响Web服务的先前版本
  • 无代码重复。只有更改作为新类实现

这两种方法都不是最佳选择,但我们没有找到太多有关这方面的信息。所以,我的问题是:你会使用这两种方法中的哪一种?或者你会采取一种完全不同的方法吗?


答案 1

当从Java生成wsdls时,我会使用包解决方案:

com.company.webservice.v3.  

它有代码重复问题,但是POJO和转换器在版本之间有差异,所以代码重用可能毕竟不是很可行。主要优点是,如果您想摆脱旧版本,只需删除相关软件包即可。

我会在URL中保留版本号,因为你无论如何都不会做REST。此外,如果某些版本仍在使用,则可以签入访问日志。


答案 2

推荐