2012-05-04 121 views
2

我有一個類,只有一個Long變量,我希望我的輸入xml被解組。當我運行解組(單元測試附後)我得到以下錯誤的的ValidationEventHandlerJaxb Unmarshaller以不同的方式處理Long和Integer

[severity=ERROR,message=For input string: "",locator=node=null,object=null,url=null,line=1,col=96,offset=-1]] 
LinkedException: java.lang.NumberFormatException: For input string: "" 

拋出的類和單元測試是這樣的 -

@XmlRootElement 
    public class Annotation { 

    private Long creatorNo; 

    public Long getCreatorNo() { 
     return creatorNo; 
    } 

    public void setCreatorNo(Long creator) { 
     creatorNo = creator; 
    } 
} 

單元測試 -

public class AnnotationTest { 

    @Test 
    public void testUnmarshall() throws Exception { 
     final String inputXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><annotation><creatorNo></creatorNo></annotation>"; 
     final JAXBContext jaxbContext = JAXBContext.newInstance(Annotation.class); 
     final Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
     unmarshaller.setEventHandler(new UnmarshallerValidationEventHandler()); 
     final Annotation annotationObject = (Annotation)unmarshaller.unmarshal(new StringReader(inputXML)); 
    } 
} 

從看起來像,Jaxb不喜歡被傳遞給一個Long類型的空元素。但是現在,如果我在'Annotation'類中將'creatorNo'的類型改爲Integer而不是Long,那麼不會拋出任何異常,並且Jaxb只會創建'creatorNo'類設置爲0的類。那麼爲什麼這種不同的行爲?

我之後的真實行爲是我希望Jaxb將'creatorNo'視爲可選項,並將其設置爲NULL併爲空XML元素。這可能嗎?

感謝

回答

0

注:我是EclipseLink JAXB (MOXy)鉛和JAXB 2 (JSR-222)專家小組的成員。

您看到的將空元素轉換爲Long的問題是JAXB RI問題,而不是JAXB問題,因爲其他實現(如MOXy)正確處理此用例。您可以在以下位置記錄對JAXB RI的錯誤:

解決辦法

  1. 使用JAXB(JSR-222)的另一種實現方式沒有這個問題,這個選項是編碼到標準API的一大好處。
  2. 如果您使用默認的ValidationEventHandler,則此轉換異常將被忽略,並且您的文檔將按預期解組。
  3. 使用XmlAdapter自己在StringLong之間進行轉換。您可以利用JAXB的DatatypeConverter來簡化操作。
  4. 將您的UnmarshallerValidationEventHandler的實施更改爲更能容忍轉換錯誤。

UnmarshallerValidationEventHandler

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.ValidationEventHandler; 

public class UnmarshallerValidationEventHandler implements ValidationEventHandler { 

    @Override 
    public boolean handleEvent(ValidationEvent event) { 
     return event.getSeverity() < ValidationEvent.FATAL_ERROR; 
    } 

} 
相關問題