Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Ошибка при десериализации объекта в сервлете


Автор: fixxer 19.6.2007, 15:26
В сервлет методом POST отсылается сериализованный c помощью XMLEncoder объект (ArrayList)

Тестовый сервлет, который десериализует, потом обратно сериализует и отправляет обратно работат нормально.

Код

    protected void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException {
        try {
            XMLDecoder xmlDecoder = new XMLDecoder(httpServletRequest.getInputStream());
            Object o = xmlDecoder.readObject();
            xmlDecoder.close();
            XMLEncoder encoder = new XMLEncoder(httpServletResponse.getOutputStream());
            encoder.writeObject(o);
            encoder.close();
        } catch (Exception e) {
            e.printStackTrace(httpServletResponse.getWriter());
        }
    }


В другом же сервлете вылетает exception при десериализации.

Код

XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(request.getInputStream()));
Object o = decoder.readObject();


Код

16:25:42,836 ERROR [ChartFXServlet] Error during processing the request
java.util.NoSuchElementException
        at java.util.Vector.lastElement(Vector.java:461)
        at com.sun.beans.ObjectHandler.lastExp(ObjectHandler.java:132)
        at com.sun.beans.ObjectHandler.dequeueResult(ObjectHandler.java:136)
        at java.beans.XMLDecoder.readObject(XMLDecoder.java:218)
        at com.egar.tradingstation.server.ChartFXServlet.doPost(ChartFXServlet.j
ava:69)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:810)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:252)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:173)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFi
lter.java:81)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:202)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:173)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:213)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:178)
        at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrinc
ipalValve.java:39)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit
yAssociationValve.java:159)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authentica
torBase.java:482)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValv
e.java:59)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:126)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:105)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:107)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:148)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:856)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ssConnection(Http11Protocol.java:744)
        at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpo
int.java:527)
        at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWor
kerThread.java:112)
        at java.lang.Thread.run(Thread.java:595)


отличий я не заметил
проверял что приходит
Код

InputStream is = request.getInputStream();
Scanner s = new Scanner(is);
while (s.hasNext()) {
LOG.info(s.nextLine());
}


Вроде все нормально.

Код

16:13:22,699 INFO  [ChartFXServlet] <?xml version="1.0" encoding="UTF-8"?>
16:13:22,699 INFO  [ChartFXServlet] <java version="1.5.0" class="java.beans.XMLD
ecoder">
16:13:22,699 INFO  [ChartFXServlet]  <object class="java.util.ArrayList">
16:13:22,699 INFO  [ChartFXServlet]   <void method="add">
16:13:22,699 INFO  [ChartFXServlet]    <string>EUR/USD</string>
16:13:22,699 INFO  [ChartFXServlet]   </void>
16:13:22,699 INFO  [ChartFXServlet]   <void method="add">
16:13:22,699 INFO  [ChartFXServlet]    <int>15</int>
16:13:22,699 INFO  [ChartFXServlet]   </void>
16:13:22,699 INFO  [ChartFXServlet]   <void method="add">
16:13:22,699 INFO  [ChartFXServlet]    <long>1179663202481</long>
16:13:22,699 INFO  [ChartFXServlet]   </void>
16:13:22,699 INFO  [ChartFXServlet]   <void method="add">
16:13:22,699 INFO  [ChartFXServlet]    <long>1182255202481</long>
16:13:22,699 INFO  [ChartFXServlet]   </void>
16:13:22,699 INFO  [ChartFXServlet]  </object>
16:13:22,699 INFO  [ChartFXServlet] </java>


Что это может быть? Я уже всю голову поломал.:(

Автор: Tony 19.6.2007, 15:40
Uberika new BufferedInputStream. 

Автор: fixxer 19.6.2007, 15:43
Цитата

Uberika new BufferedInputStream.  


Пофигу, пробовал по разному

Автор: Tony 19.6.2007, 16:35
Stranno

Автор: fixxer 20.6.2007, 09:37
Так. Ситуация потихоньку проясняется. В логах до ексепшна найдено следующее:

Код

2007-06-20 10:27:56,505 INFO  [STDOUT] org.xml.sax.SAXParseException: XML declaration is not well-formed
2007-06-20 10:27:56,505 INFO  [STDOUT] Continuing ...


А что он там нашел not well-formed (см. конец первого поста)? И почему в одном случае этого не происходит, а в другом происходит при одинаковом содержании потока? Ужоснах :( У кого-нибудь будут идеи?

Автор: ekr 20.6.2007, 10:41
Попробуйте добавить или убрать (если есть) xml-пролог.
<?xml .....?>

Автор: fixxer 20.6.2007, 10:46
Пролог есть. (см. конец первого поста) А как его убрать? Я же не руками формирую xml, а XMLEncoder'ом.

Автор: fixxer 20.6.2007, 11:31
Ситуация проясняется дальше. В приложениях используются разные парсеры.

где работает

Код

2007-06-20 12:28:05,405 INFO  [ChartFXServlet] class org.apache.xerces.jaxp.SAXParserFactoryImpl
2007-06-20 12:28:05,405 INFO  [ChartFXServlet] class org.apache.xerces.jaxp.SAXParserImpl


где не работает

Код

2007-06-20 12:22:04,210 INFO  [ChartFXServlet] class com.bluecast.xml.JAXPSAXParserFactory
2007-06-20 12:22:04,210 INFO  [ChartFXServlet] class сom.bluecast.xml.JAXPSAXParserFactory$JAXPSAXParser


А теперь как мне эту ситуацию утилизировать? Дело в том что это большое ear приложение не мое и сильно развернуться я там не могу. Может как-то можно подменить парсер "на чуть-чуть"?

Автор: fixxer 20.6.2007, 14:26
Проблема решилась так
Код

System.setProperty("javax.xml.parsers.SAXParserFactory", "org.apache.xerces.jaxp.SAXParserFactoryImpl");


Всем спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)