powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Premature end of file ?
12 сообщений из 12, страница 1 из 1
Premature end of file ?
    #36110313
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Столкнулся с какой-то загадочной проблемой.

Конечно, все загадочные проблемы обычно имеют простое решение, но что-то до меня пока не доходит.

Итак, имеется sax parser и validator.

Также имеются xml и xsd.

На вход подается InputStream. Он прогоняется через validator, зачем через unmarshaller, где создаются объекты на основе xml.

Сделал тест, тест проходит на ура, все отлично.

Дальше интересней. Сделал форму, через нее отправляю xml.

В сервлете использую org.apache.commons.fileupload для того, чтобы взять контент файла.

Далее inputSource уходит к валидатору - валидация проходит. В момент же parse вылетает ошибка:

org.xml.sax.SAXParseException: Premature end of file.

Я уже и не знаю что думать. Подскажите, в какую сторону копать?

Смотрел полученный файл - в нем все нормально. Тем более, он проходит xsd валидацию в коде.
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110419
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Who am I

В сервлете использую org.apache.commons.fileupload для того, чтобы взять контент файла.



Покажи кусок кода, который берет InputStream через org.apache.commons.fileupload. Попробуй сперва считать весь файл в некий байтовый буфер, и только после этого создавать inputSource - уже из буфера, что будет?
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110457
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
OOsalivanWho am I

В сервлете использую org.apache.commons.fileupload для того, чтобы взять контент файла.



Покажи кусок кода, который берет InputStream через org.apache.commons.fileupload. Попробуй сперва считать весь файл в некий байтовый буфер, и только после этого создавать inputSource - уже из буфера, что будет?

Пробовал. Брал контент в виде String и отдавал ByteArrayInputStream.

1. boolean isMultipart = ServletFileUpload.isMultipartContent(request);

2. List<FileItem> items = upload.parseRequest(request);

3. processor.processWebFormIncoming(item.getInputStream())

Я думаю все в порядке с этим, ведь валидацию xsd проходит..

Начал гуглить на тему tomcat + apache xerses.
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110541
OOsalivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Who am I

Сделал тест, тест проходит на ура, все отлично.


Раз с локальным файлом все происходит на отлично, то дело именно в загрузке файла через org.apache.commons.fileupload. Почему и спросил про кусок кода. Как вариант - попробуй для инстанса ServletFileUpload (если используется он) установить максимальный размер this.setSizeMax(maxSize).
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110559
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
upload.setSizeMax( Long .MAX_VALUE);
upload.setFileSizeMax( Long .MAX_VALUE);

Не помогает. Сейчас попробую просто через Post без формы.
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110862
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, попробовал через обычный Post запрос - та же самая ошибка.

Тесты по-прежнему проходят. Валидатор тоже успешно справляется.
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110946
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавно. )

Ошибка проявляется тогда, когда я предварительно валидирую документ. Если валидацию убираю - все проходит успешно.

Возможно, он что-то делает с InputSource у себя внутри..
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110976
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, проблема временно решена следующим дурацким образом:

В метод отдаю String.

Для валидатора и маршаллера создаю два разных InputStream.

Теперь все ок.

Остается вопрос - что такое творит валидатор...
...
Рейтинг: 0 / 0
Premature end of file ?
    #36110985
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тем, кому интересно, валидатор:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
 import  org.w3c.dom.Document;
 import  org.xml.sax.SAXException;
 import  org.apache.commons.logging.Log;
 import  org.apache.commons.logging.LogFactory;

 import  javax.xml.XMLConstants;
 import  javax.xml.parsers.DocumentBuilder;
 import  javax.xml.parsers.DocumentBuilderFactory;
 import  javax.xml.parsers.ParserConfigurationException;
 import  javax.xml.transform.Source;
 import  javax.xml.transform.dom.DOMSource;
 import  javax.xml.transform.stream.StreamSource;
 import  javax.xml.validation.Schema;
 import  javax.xml.validation.SchemaFactory;
 import  java.io.IOException;
 import  java.io.InputStream;

 public   class  Validator {

     private  Log log = LogFactory.getLog( this .getClass());

     private  javax.xml.validation.Validator validator;

    /**
     * Creates new validator
     *
     * @param xsd schema file to validate with
     */
     public  Validator(String xsd) {
        initValidator(xsd);
    }

    /**
     * Validates xml file
     *
     * @param xml xml file to validate
     * @return true if validation passed successfully, false otherwise
     */
     public   boolean  validate(InputStream xml) {
         try  {
            Document document = createDocument(xml);
            validator.validate( new  DOMSource(document));
             return  true;
        }  catch  (SAXException e) {
            log.info("Validation failed: ", e);
             return  false;
        }  catch  (IOException e) {
            log.info("Bad xml file: ", e);
             throw   new  BadXmlException();
        }
    }

     private  Document createDocument(InputStream xml) {
        DocumentBuilder parser;
         try  {
            parser = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        }  catch  (ParserConfigurationException e) {
             throw   new  BadXmlException();
        }
        Document document;
         try  {
            document = parser.parse(xml);
        }  catch  (SAXException e) {
             throw   new  BadXmlException();
        }  catch  (IOException e) {
             throw   new  BadXmlException();
        }
         return  document;
    }

     private   void  initValidator(String s) {
        InputStream xsd = getClass().getResourceAsStream(s);
        SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Source schemaFile =  new  StreamSource(xsd);
        Schema schema;
         try  {
            schema = factory.newSchema(schemaFile);
        }  catch  (SAXException e) {
             throw   new  RuntimeException("Couldn't found schema file " + xsd);
        }
        validator = schema.newValidator();
    }
}
...
Рейтинг: 0 / 0
Premature end of file ?
    #36112583
пролетевший
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по коду, валидатор успешно читает входной поток - после его работы следующему, естественно, ничего не остается ...
Надо либо дальше передавать InputSource и объекта DOM созданного в валидаторе, либо, что лучше - включить валидацию прямо в маршаллере. Tomcat использует Xerces, смотри документацию и примеры, как включить валидацию в парсере.
...
Рейтинг: 0 / 0
Premature end of file ?
    #36112593
Who am I
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пролетевшийСудя по коду, валидатор успешно читает входной поток - после его работы следующему, естественно, ничего не остается ...
Надо либо дальше передавать InputSource и объекта DOM созданного в валидаторе, либо, что лучше - включить валидацию прямо в маршаллере. Tomcat использует Xerces, смотри документацию и примеры, как включить валидацию в парсере.

Понял, спасибо. Открыл для себя новое в Java IO =)

Хотя это всегда было моей слабой стороной ввиду малочисленного использования данного API.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Premature end of file ?
    #38198582
Nymph666
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пролетевшийСудя по коду, валидатор успешно читает входной поток - после его работы следующему, естественно, ничего не остается ...
Надо либо дальше передавать InputSource и объекта DOM созданного в валидаторе, либо, что лучше - включить валидацию прямо в маршаллере. Tomcat использует Xerces, смотри документацию и примеры, как включить валидацию в парсере.

Только что столкнулась с этой же проблемой: InputStream нужно было использовать три раза в различных функциях, два из них - валидатор и парсер.
По сему сначала сохранила InputStream в byte[] и уже после этого работала с ним столько сколько хотела.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Premature end of file ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]