2012-05-22 4 views
3

Я развернул мой webapp, но по некоторым причинам некоторые исключения возникают при попытке загрузить файлы на сервер, я не знаю, почему это происходит. Иногда, когда я пытаюсь загрузить файл rich:fileUpload не загружает файл, прогресс бар компонента никогда не заполняется и на журнал Tomcat появляется исключение, как следующее:Tomcat + RichFaces 4.1 исключения при загрузке файла

may 21, 2012 8:38:04 PM org.richfaces.request.MultipartRequest25 parseIfNecessary 
SEVERE: Exception parsing multipart request: Request prolog cannot be read 
org.richfaces.exception.FileUploadException: Exception parsing multipart request: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:156) 
    at org.richfaces.request.MultipartRequest25.parseIfNecessary(MultipartRequest25.java:77) 
    at org.richfaces.request.MultipartRequest25.getParameter(MultipartRequest25.java:114) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:75) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:56) 
    at java.util.Collections$UnmodifiableMap.get(Collections.java:1339) 
    at com.sun.faces.application.view.MultiViewHandler.calculateRenderKitId(MultiViewHandler.java:220) 
    at javax.faces.application.ViewHandlerWrapper.calculateRenderKitId(ViewHandlerWrapper.java:155) 
    at com.sun.faces.context.FacesContextImpl.isPostback(FacesContextImpl.java:211) 
    at javax.faces.context.FacesContextWrapper.isPostback(FacesContextWrapper.java:402) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:188) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1824) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.io.IOException: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.readProlog(MultipartRequestParser.java:270) 
    at org.richfaces.request.MultipartRequestParser.initialize(MultipartRequestParser.java:172) 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:148) 
    ... 30 more 

may 21, 2012 8:38:04 PM org.richfaces.request.MultipartRequest25 parseIfNecessary 
SEVERE: Exception parsing multipart request: Request prolog cannot be read 
org.richfaces.exception.FileUploadException: Exception parsing multipart request: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:156) 
    at org.richfaces.request.MultipartRequest25.parseIfNecessary(MultipartRequest25.java:77) 
    at org.richfaces.request.MultipartRequest25.getParameter(MultipartRequest25.java:114) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:75) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:56) 
    at java.util.Collections$UnmodifiableMap.get(Collections.java:1339) 
    at com.sun.faces.application.view.MultiViewHandler.calculateRenderKitId(MultiViewHandler.java:220) 
    at javax.faces.application.ViewHandlerWrapper.calculateRenderKitId(ViewHandlerWrapper.java:155) 
    at com.sun.faces.context.FacesContextImpl.isPostback(FacesContextImpl.java:211) 
    at javax.faces.context.FacesContextWrapper.isPostback(FacesContextWrapper.java:402) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:188) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:473) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:455) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:399) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:191) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1824) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.io.IOException: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.readProlog(MultipartRequestParser.java:270) 
    at org.richfaces.request.MultipartRequestParser.initialize(MultipartRequestParser.java:172) 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:148) 
    ... 33 more 

may 21, 2012 8:38:04 PM org.richfaces.request.MultipartRequest25 parseIfNecessary 
SEVERE: Exception parsing multipart request: Request prolog cannot be read 
org.richfaces.exception.FileUploadException: Exception parsing multipart request: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:156) 
    at org.richfaces.request.MultipartRequest25.parseIfNecessary(MultipartRequest25.java:77) 
    at org.richfaces.request.MultipartRequest25.getParameter(MultipartRequest25.java:114) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:75) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:56) 
    at java.util.Collections$UnmodifiableMap.get(Collections.java:1339) 
    at com.sun.faces.application.view.MultiViewHandler.calculateRenderKitId(MultiViewHandler.java:220) 
    at javax.faces.application.ViewHandlerWrapper.calculateRenderKitId(ViewHandlerWrapper.java:155) 
    at com.sun.faces.context.FacesContextImpl.isPostback(FacesContextImpl.java:211) 
    at javax.faces.context.FacesContextWrapper.isPostback(FacesContextWrapper.java:402) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:188) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1824) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.io.IOException: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.readProlog(MultipartRequestParser.java:270) 
    at org.richfaces.request.MultipartRequestParser.initialize(MultipartRequestParser.java:172) 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:148) 
    ... 30 more 

may 21, 2012 8:38:04 PM org.richfaces.request.MultipartRequest25 parseIfNecessary 
SEVERE: Exception parsing multipart request: Request prolog cannot be read 
org.richfaces.exception.FileUploadException: Exception parsing multipart request: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:156) 
    at org.richfaces.request.MultipartRequest25.parseIfNecessary(MultipartRequest25.java:77) 
    at org.richfaces.request.MultipartRequest25.getParameter(MultipartRequest25.java:114) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:75) 
    at com.sun.faces.context.RequestParameterMap.get(RequestParameterMap.java:56) 
    at java.util.Collections$UnmodifiableMap.get(Collections.java:1339) 
    at com.sun.faces.application.view.MultiViewHandler.calculateRenderKitId(MultiViewHandler.java:220) 
    at javax.faces.application.ViewHandlerWrapper.calculateRenderKitId(ViewHandlerWrapper.java:155) 
    at com.sun.faces.context.FacesContextImpl.isPostback(FacesContextImpl.java:211) 
    at javax.faces.context.FacesContextWrapper.isPostback(FacesContextWrapper.java:402) 
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:188) 
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116) 
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:473) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329) 
    at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:455) 
    at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:399) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:191) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515) 
    at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1824) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.io.IOException: Request prolog cannot be read 
    at org.richfaces.request.MultipartRequestParser.readProlog(MultipartRequestParser.java:270) 
    at org.richfaces.request.MultipartRequestParser.initialize(MultipartRequestParser.java:172) 
    at org.richfaces.request.MultipartRequestParser.parse(MultipartRequestParser.java:148) 
    ... 33 more 

Любая идея о том, что может быть происходит? Где я могу начать искать исправления в моем приложении?

Cheers,

+0

Это кажется библиотека проблема совместимости: см https://community.jboss.org/message/633568 – Luca

+0

ли вы разрешить это? Plz сообщите мне. Tnx. – Sara

ответ

3

У меня был тот же StackTrace в моем проекте. Я могу объяснить, почему это происходит, и несколько способов исправить это.

Таким образом, компонент richload fileUpload предполагает, что множественный запрос InputStream еще не читался из других мест. Но если у вас есть в вашем приложении любой фильтр, который выполняет простой request.getParameter(anyParamName), это заставляет multipart-запрос читать полный входной поток и помещать все в коллекцию request.getParts().

Когда файл filesupload пытается прочитать что-то из входного потока, он не может этого сделать, потому что курсор потока находится в конце (это в источниках tomcat) и просто возвращает -1; Это приводит к тому, что richfaces думает, что ничего не может прочитать из потока.

Чтобы исправить это, вы можете удалить все фильтры, которые заставляют multipart-запрос анализировать inputStream. Также в качестве исправления вы можете попробовать изменить некоторые из классов richfaces, например MultipartRequest25 или MultipartRequestParser.

Я добавил исправление к MultipartRequestParser, чтобы проверить, есть ли у запроса уже части и попытаться проанализировать его в файле FileUploadParam. Это довольно хакерская проверка сообщения об исключении, но она может работать как исправление.

Существует не разрешенная проблема в jboss jira, которая, похоже, касается этой проблемы. Вы можете проверить это. Я тоже добавил комментарий. https://issues.jboss.org/browse/RF-13061

public void parse() throws FileUploadException { 
    try { 
     initialize(); 

     while (!sequenceMatcher.isEOF()) { 
      readNext(); 
     } 
    } catch (IOException e) { 
     if(e.getMessage().equals(REQUEST_PROLOG_CANNOT_BE_READ)){ 
      //means it can not read request prolog. maybe application server already read everything and stores data in parts 
      try { 
       if(request.getParts()!=null && request.getParts().size()>0){ 
        Collection<Part> parts = request.getParts(); 
        //parts seem to be complete files so get the headers and so on here 
        //and create fileUploadItems from parts 
        for(Part part:parts){ 
         String headersString = part.getHeader("content-disposition"); 
         Multimap<String, String> headers = LinkedListMultimap.create(); 
         String[] split = headersString.split("\r\n"); 
         for (String headerString : split) { 
          parseParams(headerString, "; ", headers); 
         } 
         FileUploadParam param = createParam(headers); 
         if (param == null) { 
          continue; 
         } 
         param.create(); 
         try{ 
          int size = (int)part.getSize(); 
          byte[] buf = new byte[size]; 
          part.getInputStream().read(buf, 0, size); 
          param.handle(buf, size); 
         }finally{ 
          param.complete(); 
         } 

         if (param.isFileParam()) { 
          uploadedFiles.add(new UploadedFile25(param.getName(), param.getResource(), headers)); 
         } else { 
          parametersMap.put(param.getName(), param.getValue()); 
         } 
        } 
        //return from the method if everything was successfull 
        return; 
       } 
      } catch (Exception e1) { 
       this.cancel(); 
       throw new IllegalStateException("Could get Parts from the request", e1); 
      } 
     } 
     this.cancel(); 
     throw new FileUploadException(MessageFormat.format("Exception parsing multipart request: {0}", e.getMessage()), e); 
    } 
} 

+0

Спасибо за ваши отзывы. Не могли бы вы привести конкретный пример для «удалить все фильтры, которые заставляют multipart-запрос анализировать inputStream»? –

+0

Возможно, это уже поздно, чтобы ответить на ваш вопрос, но я имел в виду, что, когда у вас есть цепочка фильтров, которая перехватывает ваш запрос и некоторые из фильтров в этом цепочном вызове request.getParameter ('someParam'), он заставляет сервер приложений читать входные данные и после этого курсор inputstrean остается в конце. Поэтому вы можете просто убедиться, что у вас нет фильтров, которые перехватывают ваш запрос и вызывают методы request.getParameter() или request.getParameterMap. – trims

Смежные вопросы