我需要在解码 JAXB 对象后运行一些验证代码。我的解码程序的事件处理程序设置为 DefaultValidationEventHandler
。
在我添加 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()
方法中添加一些内容来保留异常详细信息?我错过了什么?
最佳答案
我无法重现您在问题中描述的内容。以下是我尝试过的。
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");
}
}
演示代码
在下面的演示代码中,我们将解码一个文档,该文档将触发 Bar
类上的 afterUnmarshal
方法。
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
关于java - 在 jaxb 中解码时我的异常发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15142943/