Java JaxB Unmarshaller, дающий org.xml.sax.SAXParseException Преждевременное завершение файла - PullRequest
0 голосов
/ 23 мая 2018
private Course unmarshalCourse(InputStream is) throws CourseServiceException, IOException{
        Course c=null;
        try{
            JAXBContext jc = JAXBContext.newInstance( "com.sakai.domain" );
            Unmarshaller u = jc.createUnmarshaller();
            String theString = IOUtils.toString(is, "UTF-8"); 
            log.debug("---------xml"+theString);
            Object value = u.unmarshal(is);

            c=(Course)value;
            log.debug("---------course"+c);
        }catch(JAXBException e){
            //je.printStackTrace();
            throw new CourseServiceException(e, Error.CONFIG);
        }
        return c;
    }

Я получаю входной поток в виде xml.when, я пытаюсь разархивировать его после запуска следующей ошибки. Пожалуйста, помогите.номер строки: 1;columnNumber: 1;Преждевременное завершение файла.] Com.course.logic.CourseServiceException: javax.xml.bind.UnmarshalException - со связанным исключением: [org.xml.sax.SAXParseException;номер строки: 1;columnNumber: 1;Преждевременный конец файла.]

1 Ответ

0 голосов
/ 27 мая 2018

Проблема вызвана тем, как вы используете InputStream is.

String theString = IOUtils.toString(is, "UTF-8"); 
log.debug("---------xml"+theString);
Object value = u.unmarshal(is);

Сначала вы потребляете весь InputStream, читая его с IOUtils.toString(is, "UTF-8").Конечно, после этого вы находитесь в конце потока.Затем вы пытаетесь продолжить чтение из этого потока по u.unmarshal(is).Не удивительно, что теперь вы получаете исключение с Premature end of file.

Чтобы исправить это, не разбирайте с InputStream is.но не маршал от String theString:

String theString = IOUtils.toString(is, "UTF-8"); 
log.debug("---------xml"+theString);
Object value = u.unmarshal(new StringReader(theString));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...