如何使 WebMethod 参数成为必需

Posted

技术标签:

【中文标题】如何使 WebMethod 参数成为必需【英文标题】:How can I make a WebMethod parameter required 【发布时间】:2011-01-13 16:46:12 【问题描述】:

我们使用“从 Java 开始”的方法来使用 Metro 1.5 堆栈创建 JAX-WS 2.0 Web 服务。当我们将像 SoapUI 这样的标准工具指向我们的一个 Web 服务时,它表明 WebMethods 的参数是可选的。生成的 xsd 显示 minOccurs=0。

我需要一种在“从 Java 开始”方法中使 WebMethod 参数成为必需的方法(可能是 xsd 中的 minOccurs=1)。我认为对此有一个 Java 注释,但我一直找不到。 XmlElement 注解具有必需属性,但 XmlElement 不能应用于 WebMethod 参数。

除了手动编辑 xsd 并将 minOccurs 设置为 1 之外,有没有办法让我的 WebMethod 参数成为必需?

【问题讨论】:

【参考方案1】:

我已经验证 Metro 2.0 确实允许您在参数上设置 @XmlElement(required=true)。生成的 xsd 没有minOccurs=0。它将minOccurs 排除在生成的xsd 之外,因此它采用默认值1。

您还必须通过将 JAX-WS 2.2 webservices-api.jar 放在 endorsed/ 目录中来升级您的 JDK。

我发布了同样的问题on the Java forums。

感谢 jitu 的回答并指出 minOccurs 默认为 1,因此将其保留在 .xsd 之外具有预期的效果。

当在参数上设置@XmlElement(required=true) 时,SoapUI 不再指示该参数为可选。

【讨论】:

【参考方案2】:

生成的 xsd 显示 minOccurs=0。

这是每个规范:任何非基元都是可选的,只有基元是必需的。

我需要一种方法在“从 Java 开始”方法中使 WebMethod 参数成为必需(可能是 xsd 中的 minOccurs=1)。

这是不可能的,除非您使用前面提到的原语。

实际上,这就是 Java 优先糟糕的原因之一(是的,开发人员喜欢它,但 it just does not work):它很脆弱,合同可能会改变(!),它并没有给你所有的控制权需要,它不需要fit well with WS-Security 等。所以,确实,contract-first 并不令人愉快,但至少,它有效。

【讨论】:

感谢 cmets 和链接。我希望那些臃肿的网络服务书籍(其中一些我已经阅读过 - 我的意思是涉水过)能像你一样清楚地说明这一点。 @Dean 不客气。并感谢您对 JAX-WS 2.2 的反馈(即使这实际上不在最初问题的范围内)。 我会说 WSDL-first 同样不起作用。您链接到的博客讨论了使用复杂的 Request 和 Return 对象进行包装,但这会带来许多问题,例如在底层字段中隐藏所需的东西、滥用重用等……再说一次,我会举起一个使用 Spring 和代理使 WebService 之类的东西看起来像本地接口的简单实现这样的好例子。以这种方式修改本地界面是让您不会忘记它是碰巧通过 JAX-WS 公开的服务的一部分。【参考方案3】:

这是对同一问题的另一个讨论。根据响应 Metro 2.0 支持将 @XmlElement 放在方法参数上,这应该可以解决我的问题。

http://forums.java.net/jive/thread.jspa?messageID=385565&#385565

Metro 2.0 于 2009 年 12 月 10 日发布,因此不再在 EA 中。我会试一试,看看它是否有效。

【讨论】:

好像可以,但是提供的链接是404,有机会更新源码吗?

以上是关于如何使 WebMethod 参数成为必需的主要内容,如果未能解决你的问题,请参考以下文章

如何使外键成为必需?

如何使标签描述成为必需

如何使 Bootstrap 下拉菜单成为必需?

如何使材料 UI 的自动完成字段成为必需?

如何使我的单选按钮成为必需的[重复]

如何使我自己的 JavaScript 函数具有必需的参数?