Jaxb org.xml.sax.saxparseexception : premature end of file

编程技术  /  houtizong 发布于 3年前   146
如果在使用JAXB把xml文件unmarshal成vo(XSD自动生成的vo)时碰到如下错误:
org.xml.sax.saxparseexception : premature end of file
很有可能时你直接读取文件为inputstream,然后将inputstream作为构建unmarshal需要的source参数。InputSource inputSource = new InputSource(inputStream)。即你是按如下方式调用下面提供的方法的


InputStream msgInputStream = new ClassPathResource("data/MessageSample.xml").getInputStream();Wrapper messageWrapper = parseMessage(msgInputStream, Wrapper.class);


解决方案是,首先将文件内容读成字符串content,让后用字符串构建ByteArrayInputStream bis,由bis来构建source就不会报错了。InputSource inputSource = new InputSource(bis),即如下使用上面的parseMessage方法
parseMessage(new ByteArrayInputStream(content.getBytes()), targetType)


文中用到的parseMessage方法
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;}

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!

留言需要登陆哦

技术博客集 - 网站简介:
前后端技术:
后端基于Hyperf2.1框架开发,前端使用Bootstrap可视化布局系统生成

网站主要作用:
1.编程技术分享及讨论交流,内置聊天系统;
2.测试交流框架问题,比如:Hyperf、Laravel、TP、beego;
3.本站数据是基于大数据采集等爬虫技术为基础助力分享知识,如有侵权请发邮件到站长邮箱,站长会尽快处理;
4.站长邮箱:[email protected];

      订阅博客周刊 去订阅

文章归档

文章标签

友情链接

Auther ·HouTiZong
侯体宗的博客
© 2020 zongscan.com
版权所有ICP证 : 粤ICP备20027696号
PHP交流群 也可以扫右边的二维码
侯体宗的博客