2013-02-06 75 views
1

我正在開發基於SOAP的WebService(JAX-WS),並且日期以特定格式「yyyymmdd」發佈。我的WSDL將日期定義爲字符串,但是當期望的格式沒有跟隨元素值時,我想返回一個SOAP錯誤響應。 我定義爲元素的XMLAdapter,並試圖在解組方法如下:如何從XMLAdapter返回SOAPFault?

public XMLGregorianCalendar unmarshal(String value) throws Exception { 
    if (!checkCorrectFormat(value)){ 
     throw new RuntimeException(); 
    } 

    return ParseHelper.getInstance().parseStrDateToXMLDate(value); 
} 

但異常丟失,WebService的推移沒有問題得到的解組元素的空XMLGregorianCalendar值。也許這是不適合實施這種格式控制的地方... 任何幫助,將不勝感激。

回答

0

考慮實施在您的XSD這個表達式限制:

<xsd:simpleType name="MySpecialDate"> 
    <xsd:restriction base="xsd:string"> 
     <xsd:pattern value="\d{4}\d{2}\d{2}"/> 
     <xsd:whiteSpace value="collapse"/> 
    </xsd:restriction> 
    </xsd:simpleType> 

\ d {4} - \ d {2} - \ d {2},因爲你需要遵循的規則可能不是很嚴格的公曆。例如,2012 12將不是有效的公曆日期,因爲有no 13th month in the gregorian calendar,但它仍然會通過您的正則表達式限制。但你可以肯定地創建一個正則表達式符合格雷戈裏規則與谷歌搜索夫婦。

然後,讓JAXWS爲您完成模式驗證。看到http://www.jroller.com/gmazza/entry/soap_xml_schema_validation

「激活服務端驗證」另外,如果你需要做的,你不能使用XSD的CCYYMMDD格式:日期,在我心中,將是可取的,因爲JAXB將創建個java.util 。從一開始就爲您提供您的財產權利。你仍然可以用你自定義的ccyymmdd格式實現這一點(生成一個java.util.Date),但是它有點多。你可能會使用jaxb custom binding。像這樣的東西會進入你的.jxb文件,並與XJC任務中:

<jxb:bindings node="//xs:simpleType[@name='MySpecialDate']"> 
    <jxb:javaType name="java.util.Date" 
     parseMethod="com.company.DateConverter.parseMySpecialDate" 
     printMethod="com.wpsic.tricare.ws.converter.DateConverter.printMySpecialDate" /> 
</jxb:bindings>