【问题标题】:Prevent Enum in Java XML Web Services防止 Java XML Web 服务中的枚举
【发布时间】:2012-05-19 11:23:33
【问题描述】:

我喜欢 Enum 的类型安全性,而且它使代码更具可读性。只要有机会,我总是使用Enum

当我需要将这些代码公开为 Web 服务时,问题就开始了。例如,如果我有这样的枚举:

public enum Language {
    ENGLISH(1),
    BAHASA_MALAYSIA(2);
}

它将在 wsdl 中公开如下:

<xs:simpleType name="language">
<xs:restriction base="xs:string">
  <xs:enumeration value="ENGLISH"/>
  <xs:enumeration value="BAHASA_MALAYSIA"/>
  </xs:restriction>
</xs:simpleType>

如果将来我决定添加一种新语言会遇到麻烦,那么 wsdl 文件会有所不同,并且会破坏旧客户端。

我的问题,如何防止枚举在 wsdl 中暴露为枚举?我希望它以Stringint 的简单数据类型公开。

如果有问题,我正在使用JBoss WS

【问题讨论】:

  • 您使用的是哪个 Web 服务框架?
  • 这有关系吗?我正在使用 JBoss WS
  • 是的,这很重要;这就是我问的原因。
  • 你的客户还不会破产吗?不知道如何处理新值,无论它们是如何编码的?
  • 改变的是值,而不是 wsdl,所以一个好的客户端应该能够处理它。假设我开始为FRENCH 返回3 并且客户不理解这一点,他们应该优雅地处理它(例如默认为ENGLISH)。但是如果 wsdl 改变了他们的代码将会中断,直到他们重建他们的代理代码。

标签: java web-services enums jax-ws jbossws


【解决方案1】:

如果将来我决定添加一种新语言我会遇到麻烦,那么 wsdl 文件将会 > 不同并且会破坏旧客户端。

不,它不会破坏旧的(构造良好的)客户端。向枚举添加值可以被认为是向后兼容的更改。见Extensibility, XML Vocabularies, and XML Schema之类的文章。

根据您的说法,我首先猜测您的工作代码,然后让 JBoss-WS 生成 WSDL 和 XSD。没有什么不妥。但是,如果向后和向前兼容性对您来说非常重要,您应该首先使用合同(即手动设计 WSDL 和 XSD)。因为你永远不知道 WSDL 和 XSD 的新版 JBossWS 会是什么样子。

如果您真的希望 JBoss-WS 生成不同的东西,那么您需要查看 JAX-B 的枚举。 JAX-B 是真正的 XSD 生成。

【讨论】:

  • 是的,我确实先编写代码,然后让 JBoss WS 生成 WSDL。想想看,你的答案很有道理……我必须对此进行测试。
  • 我无法理解合同优先在这种情况下的帮助。如果生成的 WSDL 文件包含枚举类型,那么您仍然会遇到同样的问题,即如果将新值添加到枚举类型,过时的客户端会中断?还是您不会在 WSDL 中将其定义为枚举类型,而是使用标准字符串?
  • @craigrs84 这些是两个不同的东西。首先,添加枚举是一种向后兼容的更改,如前所述。当然,构造不佳的客户端可能会崩溃,但除了制作同一端点的多个不同版本之外,对于构造不佳的客户端,您无能为力。其次,如果你想保证一个一致的端点,你应该首先使用合同而不是代码。我建议不要使用字符串;在适当的情况下使用枚举,但对于构​​造不佳的客户端来说太糟糕了。
  • 如果您向旧客户端发送新语言,它将崩溃。所以它不向前兼容。
  • "如果您向旧客户端发送新语言,它将崩溃。因此它不向前兼容。"如果它是一个枚举,您只在请求中接受它是一个向前兼容的更改。但是,是的,如果您开始将其作为响应发送,可能会导致老客户出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多