2013-02-28 123 views
1

我需要在我的JAXB對象解組之後運行一些驗證代碼。我的unmarshaller的事件處理程序設置爲DefaultValidationEventHandler在jaxb中解組時,發生了什麼異常?

之前,我添加了一個afterUnmarshal()方法,當我的代碼拋出一個異常,它出來是這樣的:

DefaultValidationEventHandler: [ERROR]: com.example.ExceptionClass Error message 
    Location: line 3 

但是現在,我越來越

DefaultValidationEventHandler: [ERROR]: null 
    Location: line 3 

afterUnmarshal()

void afterUnmarshal(final Unmarshaller unmarshaller, final Object parent) { 
    //validation code that may throw a runtime exception 
} 

有什麼我應該把我的afterUnmarshal()方法來保持異常的細節?我錯過了什麼?

回答

2

我一直無法重現您在問題中所描述的內容。以下是我所嘗試過的。

Java模型

import javax.xml.bind.annotation.*; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Foo { 

    private Bar bar; 

} 

酒吧

Bar類只包含一個afterUnmarshal方法拋出一個RuntimeException

import javax.xml.bind.Unmarshaller; 

public class Bar { 

    void afterUnmarshal(final Unmarshaller unmarshaller, final Object parent) { 
     throw new RuntimeException("Hello World"); 
    } 

} 

演示代碼

在演示代碼下面我們將解組的文件,將觸發對BarafterUnmarshal方法。

import java.io.StringReader; 

import javax.xml.bind.*; 
import javax.xml.bind.helpers.DefaultValidationEventHandler; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Foo.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     unmarshaller.setEventHandler(new DefaultValidationEventHandler()); 

     StringReader xml = new StringReader("<foo><bar/></foo>"); 
     Foo foo = (Foo) unmarshaller.unmarshal(xml); 
    } 

} 

輸出

RuntimeException我們扔掉顯示出來的堆棧跟蹤。

Exception in thread "main" javax.xml.bind.UnmarshalException 
- with linked exception: 
[java.lang.reflect.InvocationTargetException] 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleError(UnmarshallingContext.java:671) 
    at com.sun.xml.bind.v2.runtime.JaxBeanInfo.invokeUnmarshallCallback(JaxBeanInfo.java:555) 
    at com.sun.xml.bind.v2.runtime.JaxBeanInfo.invokeAfterUnmarshalMethod(JaxBeanInfo.java:546) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.fireAfterUnmarshal(Loader.java:225) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.leaveElement(StructureLoader.java:271) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.endElement(UnmarshallingContext.java:506) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.endElement(SAXConnector.java:156) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:606) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(AbstractXMLDocumentParser.java:183) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:353) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2715) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:607) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:116) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:488) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:835) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:764) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:123) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1210) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:568) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:211) 
    at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:184) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157) 
    at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:214) 
    at forum15142943.Demo.main(Demo.java:17) 
Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.sun.xml.bind.v2.runtime.JaxBeanInfo.invokeUnmarshallCallback(JaxBeanInfo.java:551) 
    ... 22 more 
Caused by: java.lang.RuntimeException: Hello World 
    at forum15142943.Bar.afterUnmarshal(Bar.java:8) 
    ... 27 more 
+0

這實際上是發生了什麼事情。我正在使用DefaultValidationEventHandler打印出錯誤,並且錯誤消息爲空。我們的錯誤消息已經傳播到e.cause.target的級別,所以它沒有顯示在控制檯中。 – chama 2013-03-01 15:26:41