2014-06-26 49 views
2

我一直在試圖找到這個特定主題的解決方案:如何在java web服務中定義@WebParam的默認值?

可以在基於SOAP/WSDL的Web服務的@webParam註釋中定義一個默認值?我要的是完全以下結果:

我在我的web服務的@WebMethod稱爲具有以下簽名GetCustomers的:

@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> 

請的NotI CE名爲limitTop

這是爲了讓客戶端應用程序發送SOAP消息沒有limitTop元素的元素的默認屬性,但仍然限制的記錄數返回默認值在limitTop元素中給出。

我正在使用Java,JAX-WS和GlassFish Server Open Source Edition。

感謝您的幫助。

卡羅·亞涅斯

回答

2

你不能用你目前webservice的風格來實現之後是什麼。首先,JAXB不會在消息中注入默認值,如果該元素不存在於發送的原始消息中,則。來自JAXB manual

當元素不存在時,元素的默認值不會跳入,所以不幸的是我們不能改變這種行爲。

作爲一種解決方法,您可以將您的webservice樣式更改爲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就可以忽略不存在的價值和可能設置默認解組後

+0

好的,kolossus,謝謝你的幫助,我有你的建議解決方案非常清楚,我沒有清楚的是所提到的web服務風格改變爲包裝,應該做什麼來改變我的web服務風格?無論如何,你的回答能幫助我解釋我對這個問題的懷疑。再次感謝你。 –

+1

@CarloYañez - 看看[這個答案](http://stackoverflow.com/questions/5324051/webservices-bare-vs-wrapped) – kolossus

+0

非常感謝Kolossus。 –