SOAP WS – 使@WebParam可选

我有一个非常简单的方法,我通过JAX-WS注释在WS API中使用它:

@WebMethod public MyResponse sendSingle2( @WebParam(name="username") String username, @WebParam(name="password") String password, @WebParam(name="newParam") String newParam) { // the code } 

现在我希望newParam是可选的。 我的意思是我希望该方法不仅可以在传递的xml中参数为空时工作:

  user pass   

但是当它不存在时:

  user pass  

我需要它不要破坏现有的API,它在没有新参数的情况下工作。

@WebParam将消息部分映射到参数,而部分不能是可选的。 请参阅WSDL中的可选消息部件 。 因此,简短的回答是,你所要求的正是无法完成的。 但是,如果您可以重构此方法,则可以使用下面描述的方法之一。

通常,参数的可选性通过模式minOccurs=0 。 此外,您可以在架构中定义一个Request参数,而不是使用多个参数,您可以将其定义为WebMethod参数。 可选项现在封装在参数中,并且对于带或不带可选参数的调用调用相同的方法。

我更喜欢先定义合约而不是依赖自动生成的文件。 一旦你弄清楚XSD,SOAP和WSDL如何在一起玩,你几乎不想再使用基于注释/代码优先的定义了,因为你反过来更灵活。

代码示例:

  ...          ...  

在您的WSDL文件中,您可以像这样定义消息:

         ...   ...       ...      ...             ...        

这里的WSDL契约定义了使用样式: document/literal并且在模式的帮助下,实际的SOAP消息将是document/literal wrapped ,这也符合WS-I。

因此,您的方法将更改为公共MyResponse sendSinge2(MyRequest request) ,其中request现在封装usernamepassowrdnewParam 。 如果没有使用SOAP请求发送newParam ,它只会返回null ,因此在使用它之前最好先检查一下。

如果您坚持使用代码优先方法,则需要首先定义MyRequest类,将其用作请求参数而不是那些2或3值。

 @XmlAccessorType(XmlAccessType.FIELD) @XmlRootElement(name = "MyRequest", namespace="http://your.namespace.com") public class MyRequest implements Serializable { @XmlElement(name = "username", required = true) protected String username; @XmlElement(name = "password", required = true) protected String password; @XmlElement(name = "newParam", required = false) protected String newParam; ... } 

如果你还没有完成,我们应该为MyResult做同样的事情。 web方法现在可能看起来像这样:

 @WebMethod(operationName = "sendSingle2") @WebResult(name = "sendSingle2Response", targetNamespace = "http://your.namespace.com") public MyResult sendSingle2(@WebParam(name = "sendSingle2Request") MyRequest request) { ... } 

同样, request封装3个参数,您应该检查可选参数是否为null。

HTH

这完全取决于您使用这些参数的实现类。 在端点接口处,只需将此参数添加为webparam。

确保在实现类中如果在任何地方使用此参数,请添加替代代码(Else部分)以执行操作或执行,而不使用此参数。

我认为所有参数都视为可选参数,除非您validation它们或按照建议在实现类中使用它们。