2012-06-20 193 views
10

我正在使用JAXB XMLadapter編組和解組布爾值。應用程序的XML文件也將由C#應用程序訪問。我們必須驗證這個XML文件,並且這是使用XSD完成的。 C#應用程序爲布爾節點寫入「True」值。但是我們的XSD也會得到驗證,因爲它只允許「真/假」或「1/0」。所以我們在XSD中爲布爾值保留了字符串,並且該字符串將由XMLAdapter進行驗證以對我們進行編組和解組。 XML適配器如下: JAXB XMLAdapter方法不會拋出異常

public class BooleanAdapter extends XmlAdapter<String, Boolean> 
{ 
@Override 
    public Boolean unmarshal(String v) throws Exception 
    { 
     if(v.equalsIgnoreCase("true") || v.equals("1")) 
     { 
      return true; 
     } 
     else if(v.equalsIgnoreCase("false") || v.equals("0")) 
     { 
      return false; 
     } 
     else 
     { 
      throw new Exception("Boolean Value from XML File is Wrong."); 
     } 
    } 

    @Override 
    public String marshal(Boolean v) throws Exception 
    { 
     return v.toString();   
    } 
} 

上述代碼工作在正常條件下,但是,當無效的數據(例如:「ABCD」或「」)是從XML文件中讀取那麼「拋出新的異常(); 「沒有得到傳播,Unmarshal進程繼續讀取下一個節點。 我希望應用程序在引發異常時立即停止。 這似乎是我的例外被吃掉了。 任何幫助,非常感謝。

如何解決此問題?

回答

17

XMLAdapter#unmarshal(ValueType)的JavaDoc:

拋出: java.lang.Exception - 如果在轉換過程中有一個錯誤。調用者負責通過ValidationEventHandler向用戶報告錯誤

所以,是的 - 例外是,然後使用ValidationEventHandler,不扔你堆棧的頂部報告。

檢查您是否已經使用任何(自定義,也許)ValidationEventHandler該組的異常,或使用DefaultValidationEventHandler,像這樣:

unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

這將導致第一個錯誤解組故障。

+0

謝謝@npe: 這工作..! :) 對ValidationEventHandler()不太瞭解,但是您指向JavaDoc的指針幫了很大忙。 只需設置 unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 做了工作.. 標記您的解決方案作爲答案.. 乾杯..! –