[size=small]如果在使用JAXB把xml文件unmarshal成vo(XSD自动生成的vo)时碰到如下错误:
org.xml.sax.saxparseexception : premature end of file
很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new InputSource(inputStream)。即你是按如下方式调用下面提供的方法的[/size]
[size=small]解决方案是,首先将文件内容读成字符串content,让后用字符串构建ByteArrayInputStream bis,由bis来构建source就不会报错了。InputSource inputSource = new InputSource(bis),即如下使用上面的parseMessage方法[/size]
[size=small]文中用到的parseMessage方法[/size]
org.xml.sax.saxparseexception : premature end of file
很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new InputSource(inputStream)。即你是按如下方式调用下面提供的方法的[/size]
InputStream msgInputStream = new ClassPathResource("data/MessageSample.xml").getInputStream();
Wrapper messageWrapper = parseMessage(msgInputStream, Wrapper.class);[size=small]解决方案是,首先将文件内容读成字符串content,让后用字符串构建ByteArrayInputStream bis,由bis来构建source就不会报错了。InputSource inputSource = new InputSource(bis),即如下使用上面的parseMessage方法[/size]
parseMessage(new ByteArrayInputStream(content.getBytes()), targetType)[size=small]文中用到的parseMessage方法[/size]
private <E> E parseMessage(InputStream inputStream, Class<E> targetType) throws JAXBException, SAXException, ParserConfigurationException {
InputSource inputSource = new InputSource(inputStream);
JAXBContext jc = JAXBContext.newInstance("generated.vo");
Unmarshaller unmarshaller = jc.createUnmarshaller();
final SAXParserFactory sax = SAXParserFactory.newInstance();
sax.setNamespaceAware(true);
final XMLReader reader = sax.newSAXParser().getXMLReader();
final Source source = new SAXSource(reader, inputSource);
JAXBElement<E> el = unmarshaller.unmarshal(source, targetType);
E vo = el.getValue();
return vo;
}

本文介绍了一种解决使用JAXB进行XML文件反序列化时出现的“premature end of file”错误的方法。该方法建议先将XML文件转换为字符串,再构建ByteArrayInputStream,并以此为基础创建InputSource来完成反序列化过程。
3万+

被折叠的 条评论
为什么被折叠?



