2013-07-31 7 views
5

Sto utilizzando Tomcat 5.5 e Spring 3.2. Nel descrittore di distribuzione web.xml, ho la seguente configurazione -Il contenitore Tomcat non riesce a utilizzare la configurazione <error-page> se si verifica un'eccezione dopo l'apertura di OutputStream dell'oggetto risposta.

<error-page> 
    <error-code>500</error-code> 
    <location>/500.jsp</location> 
    </error-page> 
    <error-page> 
    <error-code>403</error-code> 
    <location>/403.jsp</location> 
    </error-page> 
    <error-page> 
    <error-code>404</error-code> 
    <location>/404.jsp</location> 
    </error-page> 

Il comportamento inspiegabile si verifica in un metodo simile a quello qui sotto -

public ModelAndView fileDownload(HttpServletRequest request, 
           HttpServletResponse response) throws Exception 
{ 
    String filename = (String) request.getParameter("filename"); 
    //...more code 
    File file = new File(...+ filename); // pseudo code 
    OutputStream out = response.getOutputStream(); 
    InputStream stream = new FileInputStream(file); // FileNotFoundException here 
    //...more code 
} 

Quando si verifica un FileNotFoundException, non mi vedi la mia custom 500.jsp usata per visualizzare la pagina di errore, ma invece vedo l'intera traccia dello stack dell'eccezione nella pagina. Se ho semplicemente invertire l'ordine delle due affermazioni come sotto,

InputStream stream = new FileInputStream(file); // FileNotFoundException here 
    OutputStream out = response.getOutputStream(); 

tutto funziona correttamente e ho la 500.jsp corretta reso sulla pagina.

Perché si verifica? L'unica differenza era che nel secondo caso, l'OutputStream dell'oggetto risposta non era aperto.

+1

solo testare con Tomcat 5.5.36 + primavera 3.2.2.RELEASE e non può ottenere alcun problema, come si descrive qui. La pagina '500.jsp' personalizzata è stata sempre resa come previsto. E nessuna dipendenza dalla sequenza di queste due linee di codice. Si prega di fornire più file di configurazione per riprodurre questo errore. –

+2

puoi fornire la traccia dello stack che vedi nella pagina? – Akshay

+0

@CodeBlue se si sta ancora cercando una risposta, si prega di fornire la traccia dello stack dell'eccezione. – Akshay

risposta

-1

Penso che sia necessario aggiungere un controller personalizzato per il rendering delle pagine definite in web.xml.

descrizione @see qui: Custom error pages in Tomcat with Spring

+0

Funziona già per dozzine di pagine senza il controller personalizzato. – CodeBlue

+0

Creo solo un test case e non riproduco il problema, ma non ho Tomcat 5.5. Uso Tomcat 7 + Spring 3.2. Il risultato non dipende da questa sequenza di due righe. Forse un problema con web.xml o con le pagine di errore di jsp? –

-1

E 'solo una supposizione, ma credo che il problema è legato al punto, che non è possibile modificare la risposta http (intestazione) dopo è è inviare al client. O più preciso: Vedi Benjamin Pack´s answer

1

Sotto il cofano, è probabile che JSP tenti di chiamare il metodo getWriter su HttpServletResponse. Secondo le specifiche, getWriter può essere chiamato o getOutputStream può essere chiamato, ma non entrambi. Poiché hai già chiamato getOutputStream, JSP non è in grado di scrivere sulla risposta.

http://docs.oracle.com/javaee/5/api/javax/servlet/ServletResponse.html#getOutputStream()

http://comments.gmane.org/gmane.comp.jakarta.tomcat.user/182025

+0

Questo non causa un 'IllegalStateException'? L'OP sembra implicare che la 'FileNotFoundException' sia lanciata e visualizzata nella pagina di errore, ma senza ulteriori informazioni è difficile dirlo. Se l'eccezione visualizzata nella pagina di errore _is_ 'IllegalStateException', allora sospetto che questa sia la risposta corretta. – DannyMo