使用 JAXB 和 Unmarshal 过早结束文件。响应中的 xml 对我来说似乎有效
Posted
技术标签:
【中文标题】使用 JAXB 和 Unmarshal 过早结束文件。响应中的 xml 对我来说似乎有效【英文标题】:Premature end of file using JAXB and Unmarshaller. The xml fromt he response looks valid to me 【发布时间】:2013-04-16 22:37:54 【问题描述】:我不知道该怎么办了。一切似乎都是正确的;输入输出。
我生成 xml 文件并发送到某个服务进行验证。
回复是:
11:10:34,922 INFO [STDOUT] printing out the input stream
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><Response>
<Method name="XML/Release/New" time="2013-04-23T15:10:35.1446238Z">
<ResponseStatus>100</ResponseStatus>
</Method>
</Response>
finished printing out the input stream
11:10:34,922 INFO [STDOUT] got the unmarshaller
11:10:34,925 ERROR [PRNDataAccessUtil] Caught an error: javax.xml.bind.UnmarshalException
- with linked exception: [org.xml.sax.SAXParseException: Premature end of file.] : null
代码:
try
out = connection.getOutputStream();
ByteArrayOutputStream bos = PRNPostNewsReleaseUtil.createNewsReleaseXml(newsRelease);
bos.writeTo(out);
JAXBContext context = JAXBContext.newInstance(Response.class.getPackage().getName());
in = connection.getInputStream();
BufferedReader inp = new BufferedReader(new InputStreamReader(in));
System.out.println("printing out the input stream");
String line;
while((line = inp.readLine()) != null)
System.out.println(line);
System.out.println("finished printing out the input stream");
Unmarshaller unmarshaller = context.createUnmarshaller();
response = (Response) unmarshaller.unmarshal(in);
catch (Exception ex)
log.error("Caught an error: " + ex + " : " + ex.getMessage());
return null;
finally
if (null != in) connection.disconnect();
【问题讨论】:
我为此苦苦挣扎了很长时间。它在我没有改变任何东西的情况下得到了解决。我只能猜测这可能是与eclipse或weblogic服务器有关的错误。 【参考方案1】:您收到错误是因为在输出期间InputStream
已推进到末尾。假设BufferedReader
中的缓冲区足够大,可以包含整个 XML 文档,您可以在输出后重置它,然后解组。
【讨论】:
hmmmm 听起来很可能。我会测试的。我将删除系统输出,只需要查看内容。 成功了!不过还是很奇怪,我有另一种方法可以实际发布此输入,并且我还对输出进行了 sysout,以某种方式可以毫无问题地工作。谢谢!!【参考方案2】:有一次我使用了错误的类名来构建 JAXBContext 对象,所以当我尝试编组一个对象时,创建了一个空的 XML 文件,从而导致 unmarshaller 失败。
因此,请确保使用您尝试编组的类实例化 JAXBContext 对象。
【讨论】:
【参考方案3】:这里要注意的另一件事是,即使您没有在代码中显式读取缓冲区,而是有一个表达式监视来读取输入,它最终也会产生与增加流头相同的效果。在花费数小时调试此异常后发现了这一点。
【讨论】:
以上是关于使用 JAXB 和 Unmarshal 过早结束文件。响应中的 xml 对我来说似乎有效的主要内容,如果未能解决你的问题,请参考以下文章
XML解析器(Unmarshal)使用JaxB从xml文件中获取元素
Unmarshal NullPointerException(带有 JAXB 参考实现)
Jaxb UnMarshal 错误:意外元素(uri:“”,本地:“processedSalesOrderTypeList”)。预期的元素是