如何在JAXB中调试编组?

时间:2011-07-13 14:47:52

标签: java jaxb jax-ws unmarshalling

在编组期间,我得到了下一个例外

Exception in thread "main" com.sun.xml.internal.ws.encoding.soap.DeserializationException: Failed to read a response: javax.xml.bind.UnmarshalException
 - with linked exception:
[javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,1127]
Message: XML document structures must start and end within the same entity.]

所以我希望看到xml,其中[row,col]:[1,1127]。请建议。

4 个答案:

答案 0 :(得分:15)

通过在JVM选项中指定-Djaxb.debug = true,可以在控制台中看到JAXB调试输出。 另外,您可能希望在unmarshaller上设置事件处理程序: unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());

答案 1 :(得分:2)

您似乎正在反序列化SOAP消息。您可以通过将-Djavax.net.debug=all添加到JVM选项来启用HTTP调试。这将转储传入的消息。一旦您看到输入,请确保开始和结束标记匹配(根据错误消息的第二部分)。

答案 2 :(得分:1)

我建议你在XMLStreamException上创建异常断点。至少eclipse允许这样做。因此,您将能够看到抛出异常的位置。可能会有所帮助。

BTW我不确定1,1127是完全错误的。首先检查(以防万一)你在这个位置没有非法的东西。其次,检查它不是文件的第1127个字符。例如,如果文件是在Unix上生成的,其中行分隔符为\ n但是您在Windows上运行代码,其中行分隔符为\ r \ n,系统可能无法识别换行符,因此它认为您的XML格式为非常长单行。

答案 3 :(得分:0)

JAXBContext context = JAXBContext.newInstance(jaxbObjectClass);
Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new javax.xml.bind.helpers.DefaultValidationEventHandler());