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

17

背景:

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

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

  • 在URL中保留版本号(我知道有些人反对这个做法,但主要是针对REST服务)
  • 在命名空间中保留版本号。

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

  • 注释来定义我们的Web服务(以及Web服务API)
  • 带有XML注释的POJO bean,用于定义内容
  • 转换器类,用于在业务层和Web服务pojo之间进行转换
  • Spring

因此,为了保留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服务。在维护代码时,可能会错误地影响以前的版本。
  • 不会有代码重复。只有更改会被实现为新的类。

两种方法都不是最理想的,但我们没有找到太多相关信息。 那么,我的问题是: 你会选择这两种方法中的哪一种?还是采取完全不同的方法?


你会使用这两种方法中的哪一种?或者你会采取完全不同的方法?这是主观性较强的问题。 - Raedwald
1
您是否有关于这个话题的进一步经验?我正在面临同样类型的问题,我想定义最佳实践/流程来使我们的Web服务发展。 - benjamin.donze
1个回答

6
从Java生成WSDL时,我会使用包解决方案:
com.company.webservice.v3.  

它存在代码重复问题,但是POJO和转换器在不同版本之间存在差异,因此代码重用可能并不是非常可行。其主要优点在于,如果您想要摆脱旧版本,只需删除相关的包即可。

我会在URL中保留版本号,因为您并没有使用REST。此外,您可以在访问日志中检查是否仍在使用某些版本。


感谢您的输入。我认为我们也在这个方向上倾斜。困扰我们的是,通常在两个版本之间,我们会对<10个类进行微小更改,而总共有>100个类。因此,在例如Eclipse中,搜索类“MyXMLAnnotatedPOJO.java”可能会在7个不同的“v1”到“v7”包中给出7个相同的结果。 - Magnus
1
兼容性更改,例如添加额外操作,不需要新版本。此外,您也可以在类名中放置版本号。 - Hugo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接