Excepciones de Tomcat + RichFaces 4.1 al cargar el archivo

Implementé mi aplicación web pero, por alguna razón, aparecen algunas excepciones al intentar cargar archivos en el servidor, no sé por qué sucede esto. A veces, cuando intento cargar un archivo, el rich:fileUpload no carga el archivo, la barra de progreso del componente nunca se llena y aparece una excepción como la siguiente en el registro de Tomcat:

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

¿Alguna idea de lo que podría estar pasando? ¿Dónde puedo empezar a buscar arreglar esto en mi aplicación?

Saludos,

preguntado el 22 de mayo de 12 a las 15:05

Esto parece un problema de compatibilidad de la biblioteca: ver community.jboss.org/message/633568 -

¿Resolviste esto? Por favor, hágamelo saber. Tx. -

1 Respuestas

Estaba teniendo el mismo stacktrace en mi proyecto. Puedo explicar por qué sucede esto y algunas formas de solucionarlo.

Por lo tanto, el componente fileUpload de richfaces asume que la solicitud de varias partes InputStream aún no se ha leído desde otros lugares. Pero si tienes en tu aplicación algún filtro que ejecute simple request.getParameter(anyParamName) esto obliga a la solicitud de varias partes a leer el flujo de entrada completo y poner todo en request.getParts() colección.

Cuando richfaces fileupload intenta leer algo del flujo de entrada, no puede hacerlo porque el cursor del flujo está al final (esto está en las fuentes de Tomcat) y simplemente devuelve -1; Esto hace que richfaces piense que no puede leer nada de la transmisión.

Para solucionar esto, puede eliminar todos los filtros que obligan a la solicitud de varias partes a analizar inputStream. También como una solución rápida, puede intentar modificar algunas de las clases de caras ricas como MultipartRequest25 or MultipartRequestParser.

He agregado hot fix a MultipartRequestParser para comprobar si la solicitud ya tiene partes e intentar analizarlas en FileUploadParam. Esto es bastante complicado verificar el mensaje de la excepción, pero puede funcionar como una solución urgente.

Existe un problema no resuelto en jboss jira que parece tratarse de este problema. Puedes comprobarlo. Yo estaba agregando un comentario allí también. 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);
    }
}

Respondido el 28 de junio de 13 a las 00:06

Gracias por tus comentarios. ¿Podría darnos un ejemplo concreto para "eliminar todos los filtros que obligan a la solicitud de varias partes a analizar inputStream"? - David Lee

Probablemente sea tarde para responder a su pregunta, pero quería decir que cuando tiene una cadena de filtro que intercepta su solicitud y algunos de los filtros en esta solicitud de llamada de cadena. request y luego el cursor de inputstrean permanece al final. Por lo tanto, puede asegurarse de que no tiene filtros que intercepten su solicitud y llamar a los métodos request.getParameter() o request.getParameterMap. - adornos

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.