2009-10-02 66 views
1

我們使用JAXB來處理我們的wsdl驗證。在WSDL中,我們有一個枚舉,像這樣:如何使用JAXB處理無效的枚舉類型?

<xs:simpleType name="myEnum"> 
    <xs:annotation> 
     <xs:documentation>The enums which matter.</xs:documentation> 
    </xs:annotation> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="MYENUM_1"> 
      <xs:annotation> 
       <xs:documentation>MYENUM_1 is the first enum.</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
     <xs:enumeration value="MYENUM_2"> 
      <xs:annotation> 
       <xs:documentation>MYENUM_2 is the second enum.</xs:documentation> 
      </xs:annotation> 
     </xs:enumeration> 
    </xs:restriction> 
</xs:simpleType> 

如果我們傳遞了一個無效的字符串,例如一個枚舉,MYENUM_7,該值設置爲null,而不是拋出正如我們所期望的錯誤。挖掘到代碼中,我們發現從RuntimeEnumLeafInfoImpl.java如下:

package com.sun.xml.bind.v2.model.impl; 
//... 
public T parse(CharSequence lexical) throws AccessorException, SAXException { 
    // TODO: error handling 

    B b = baseXducer.parse(lexical); 
    if(b==null) { 

     return null; 
    } 

    return parseMap.get(b); 
} 

很清楚地看到,parseMap是我們的枚舉的名單,但如果關鍵的地圖,在這種情況下b的值,不在地圖中,它只是返回null。如果b不在parseMap中,我們希望它拋出和拋出異常。

修復這個問題和重新編譯我們自己的JAXB的缺點是有其他方法來解決這個問題嗎?


編輯:澄清

我們使用JAXB 2.1.9,我們要解組的數據,並對其進行驗證。我肯定有可能忽略了關於驗證的文檔。

回答

2

您在說您正在使用JAXB驗證數據,但是您只是在解組XML文檔後描述意外的結果。在JAXB,驗證和解組是兩個不同的也許是獨立的問題,因爲你可以在至少三種不同的方式使用JAXB:

  • 不驗證
  • 驗證,報告錯誤,但繼續解編
  • 驗證並解決錯誤

您確定您已啓用解組器的模式驗證,並且您正在評估潛在的錯誤嗎?如何做到這一點是非常不同的,取決於你是否使用JAXB 1.0或2.0,但文檔應該告訴你如何。

+0

它在JavaDocs中的Unmarshaller類的「驗證和完整形式」部分進行了說明。 – jarnbjo 2009-10-03 21:58:57

+0

添加鏈接:https://jaxb.dev.java.net/nonav/jaxb20-pfd/api/javax/xml/bind/Unmarshaller.html – grieve 2009-10-05 14:42:40