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
现在封装username
, passowrd
和newParam
。 如果没有使用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它们或按照建议在实现类中使用它们。