Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Premature end of file ? / 12 сообщений из 12, страница 1 из 1
27.07.2009, 11:23:04
    #36110313
Who am I
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Premature end of file ?
Столкнулся с какой-то загадочной проблемой.

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

Итак, имеется 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
27.07.2009, 11:52:55
    #36110419
OOsalivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Premature end of file ?
Who am I

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



Покажи кусок кода, который берет InputStream через org.apache.commons.fileupload. Попробуй сперва считать весь файл в некий байтовый буфер, и только после этого создавать inputSource - уже из буфера, что будет?
...
Рейтинг: 0 / 0
27.07.2009, 12:00:36
    #36110457
Who am I
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Premature end of file ?
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
27.07.2009, 12:19:16
    #36110541
OOsalivan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Premature end of file ?
Who am I

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


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

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

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

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

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

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

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

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

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

Код: 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
28.07.2009, 10:02:06
    #36112583
пролетевший
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Premature end of file ?
Судя по коду, валидатор успешно читает входной поток - после его работы следующему, естественно, ничего не остается ...
Надо либо дальше передавать InputSource и объекта DOM созданного в валидаторе, либо, что лучше - включить валидацию прямо в маршаллере. Tomcat использует Xerces, смотри документацию и примеры, как включить валидацию в парсере.
...
Рейтинг: 0 / 0
28.07.2009, 10:05:25
    #36112593
Who am I
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Premature end of file ?
пролетевшийСудя по коду, валидатор успешно читает входной поток - после его работы следующему, естественно, ничего не остается ...
Надо либо дальше передавать InputSource и объекта DOM созданного в валидаторе, либо, что лучше - включить валидацию прямо в маршаллере. Tomcat использует Xerces, смотри документацию и примеры, как включить валидацию в парсере.

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

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

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


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