如何在java Web服务中定义@WebParam的默认值?

时间:2014-06-26 23:20:16

标签: java web-services soap jaxb jax-ws

我一直在努力寻找这个特定主题的解决方案:

可以在基于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

1 个答案:

答案 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将能够忽略该值的缺失,并可能在解组之后设置默认的