我一直在努力寻找这个特定主题的解决方案:
可以在基于SOAP / WSDL的Web服务的@webParam注释中定义默认值吗?我想要的是以下结果:
我的Web服务中有一个名为getCustomers的@WebMethod,其签名如下:
@WebMethod(operationName = "getCustomers")
@WebResult(name = "customer")
public Customer[] getCustomers(@WebParam(name = "company") String company,
@WebParam(name = "limitTop") int limitTop){
//Logic of getting customer be here
}
特别是,参数 limitTop 在此方法中不是可选的,此数字表示您希望响应返回多少客户记录,但我希望在我的xml架构中,此特定元素具有默认值价值,像这样:
<xs:complexType name="getCustomers">
<xs:sequence>
<xs:element name="company" type="xs:string" minOccurs="0"/>
**<xs:element name="limitTop" type="xs:int" default="100"/>**
</xs:sequence>
</xs:complexType>
请注意名为 limitTop
的元素中的默认属性这是为了允许客户端应用程序发送不带 limitTop 元素的SOAP消息,但仍然限制返回到limitTop元素中给出的默认值的记录数。
我正在使用Java,JAX-WS和GlassFish Server开源版。
感谢您的帮助。
CarloYañez
答案 0 :(得分:2)
您现有的网络服务风格无法实现您的目标。首先,JAXB不会将默认值注入到消息中,如果该元素不在发送的原始消息中。来自JAXB manual
当元素不存在时,元素默认值不会启动,所以不幸的是我们无法改变这种行为。
作为解决方法,您可以将您的网络服务样式更改为WRAPPED
。使用此样式,您可以将Web服务参数封装在单个父类型中(如果愿意,可以使用简单的RequestWrapper
)。鉴于这种灵活性,您的客户可以提供可能包含也可能不包含这两个参数的单一父类型。您的包装器应该类似于:
@XmlRootElement
public class YourWrapper {
String company;
@XmlElement(name="limitTop",required="false",defaultValue="100")
int limitTop;
//getters and setters
}
此外,
@RequestWrapper(targetNamespace="http://you.com/ws/types", className="com.you.YourWrapper")
@WebMethod(operationName = "getCustomers")
@WebResult(name = "customer")
public Customer[] getCustomers(@WebParam(name = "company") String company,
@WebParam(name = "limitTop") int limitTop){
//Logic of getting customer be here
}
鉴于上述情况,JAXB将能够忽略该值的缺失,并可能在解组之后设置默认的