2012-05-22 45 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 

上,這可能是任何想法發生了什麼?我在哪裏可以開始尋找解決這個在我的應用程序?

CHers,

+0

這似乎是一個庫的兼容性問題: 看到https://community.jboss.org/message/633568 – Luca

+0

你解決這個問題? Plz讓我知道。 TNX。 – Sara

回答

3

我在我的項目中有相同的堆棧跟蹤。我可以解釋爲什麼會發生這種情況,並且沒有辦法解決它。

因此richfaces fileUpload組件假定多部分請求InputStream尚未從其他位置讀取。但是,如果您的應用程序中有任何執行簡單 request.getParameter(anyParamName)的過濾器,則會強制執行多部分請求以讀取完整輸入流並將所有內容都放入request.getParts()集合中。

當richfaces fileupload嘗試從輸入流中讀取某些內容時,它不能這樣做,因爲流遊標位於最後(這是在tomcat源代碼中)並且僅返回-1;這會導致richfaces認爲它無法從流中讀取任何內容。

要解決此問題,您可以刪除強制多部分請求來解析inputStream的所有過濾器。 此外,作爲一個熱修復,您可以嘗試修改一些richfaces類,如MultipartRequest25MultipartRequestParser

我已經爲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

感謝您的反饋。你能給我們一個具體的例子「刪除強制多部分請求來解析inputStream的所有過濾器」嗎? –

+0

可能這個問題很晚纔回答你的問題,但我的意思是,當你有一個過濾器鏈截取你的請求,並且這個鏈中的一些過濾器調用request.getParameter('someParam')時,它強制應用服務器讀取多部分請求,之後inputstrean的遊標保留在最後。因此,您可以確保沒有攔截請求的過濾器並調用request.getParameter()或request.getParameterMap方法。 – trims