2013-07-31 15 views
5

Używam Tomcat 5.5 i Spring 3.2. W deskryptorze wdrożenia web.xml, mam następującą konfigurację -Kontener Tomcat nie może użyć konfiguracji <error-page>, jeśli wystąpi wyjątek po otwarciu OutputStream obiektu odpowiedzi

<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> 

niewyjaśnione zachowanie występuje w sposób podobny do tego poniżej -

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 
} 

Gdy wystąpi FileNotFoundException, nie zobacz mój niestandardowy plik 500.jsp używany do renderowania strony błędu, ale zamiast tego widzę całą ścieżkę śledzenia wyjątku na stronie. Gdybym po prostu odwrócić kolejność tych dwóch stwierdzeń jak poniżej,

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

wszystko działa poprawnie i uzyskać właściwą 500.jsp renderowany na stronie.

Dlaczego tak się dzieje? Jedyną różnicą było to, że w tym ostatnim przypadku OutputStream obiektu odpowiedzi nie został otwarty.

+1

tylko przetestować go z Tomcat 5.5.36 + Wiosna 3.2.2.RELEASE i nie może dostać żadnego problemu, jak tu opisać. Niestandardowa strona '500.jsp' wyświetlana zawsze zgodnie z oczekiwaniami. I nie ma zależności od sekwencji tych dwóch linii kodu. Podaj więcej plików konfiguracyjnych, aby odtworzyć ten błąd. –

+2

Czy możesz podać ślad stosu, który widzisz na stronie? – Akshay

+0

@CodeBlue, jeśli wciąż szukasz odpowiedzi, podaj ślad stosu wyjątku. – Akshay

Odpowiedz

-1

Myślę, że trzeba dodać kontroler niestandardowy, aby renderować strony zdefiniowane w web.xml.

opis @see tutaj: Custom error pages in Tomcat with Spring

+0

Działa to już dla dziesiątek stron bez niestandardowych kontrolerów. – CodeBlue

+0

Po prostu utworzę przypadek testowy i nie odtwarzam twojego problemu, ale nie mam Tomcat 5.5. Używam Tomcat 7 + Spring 3.2. Wynik nie jest zależny od tej sekwencji dwóch wierszy. Może problem z web.xml lub ze stronami błędów JSP? –

-1

To tylko przypuszczenie, ale myślę, że problem jest związany z punktu, że nie można zmienić odpowiedzi HTTP (nagłówek) Po to wysłać do klienta. Lub bardziej precyzyjnie: Zobacz Benjamin Pack´s answer

1

Pod maską JSP prawdopodobnie spróbuje wywołać metodę getWriter w HttpServletResponse. Zgodnie ze specyfikacją, getWriter może zostać wywołany lub getOutputStream może zostać wywołany, ale nie oba. Ponieważ już wywołałeś getOutputStream, strona JSP nie może zapisać odpowiedzi.

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

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

+0

Czy nie spowodowałoby to "IllegalStateException"? OP wydaje się sugerować, że 'FileNotFoundException' jest wyrzucany i wyświetlany na stronie błędu, ale bez dodatkowych informacji trudno to stwierdzić. Jeśli wyjątek wyświetlany na stronie błędu jest "IllegalStateException", to podejrzewam, że jest to poprawna odpowiedź. – DannyMo

Powiązane problemy