2015-03-25 14 views
7

PROBLEMU<error-page> konfiguracja nie działa w Spring MVC

Chcę pokazać użytkownikowi niestandardowej strony błędu. Simeply put, <error-page> na web.xml nie działa. Mogę zgadnąć, jaki jest problem, ale muszę się dowiedzieć, dlaczego dokładnie to nie działa.


mojej konfiguracji

skonfigurować <error-page> na web.xml w mojej aplikacji MVC wiosny. Poniżej znajdują się ustawienia.

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
    <url-pattern>*.*</url-pattern> 
    <url-pattern>*.do</url-pattern>  
</servlet-mapping> 

<error-page> 
    <error-code>404</error-code> 
    <location>/error</location> 
</error-page> 

A moja strona błędu znajduje się w samym ...

WEB-INF 
└ views 
    └ Errorpages 
     └ ErrorPage.jsp 

Dla Twojej infomation, próbowałem tych rzeczy poniżej, jak również, ale żadna z tych rzeczy działało.

<error-page> 
    <error-code>404</error-code> 
    <location>/WEB-INF/views/Errorpages/ErrorPage.jsp</location> 
</error-page> 

<error-page> 
    <error-code>404</error-code> 
    <location>/views/Errorpages/ErrorPage.jsp</location> 
</error-page> 

<error-page> 
    <error-code>404</error-code> 
    <location>/Errorpages/ErrorPage.jsp</location> 
</error-page> 

<error-page> 
    <error-code>404</error-code> 
    <location>/ErrorPage.jsp</location> 
</error-page> 

<!-- Or tried those above without the .jsp that comes after ErrorPage --> 
<!-- And also, tried those after moving the resources out of WEB-INF --> 

drugiej próbie

Spojrzałem na dzienniku serwera i zauważył, że sprężyna próbuje zajrzeć do zasobów przez redirecion, więc zmieniłem plan i próbował acheive ten cel poprzez typowy powrót widoku w Spring MVC.

Zrobiłem to działanie

@RequestMapping("/error") 
public String throwsErrorPage(Locale locale, Model model) { 
    logger.info("Errorpage action..." + locale.getLanguage());    
    return "/Errorpages/ErrorPage"; 
} 

czego się spodziewałem po części rację, ponieważ z powodzeniem wywołuje działania. Dziennik Mojego serwera wyjaśnia.

WARN : org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/notfound] in DispatcherServlet with name 'appServlet' 
INFO : com.company.web.controller.HomeController - Errorpage action...ko 

Jak widać, ja wygenerowany błąd 404, wpisując notfound na URL i przekierowuje do /błędu jak podano na <location> w web.xml. Ale nie zwraca widoku.

Aby upewnić się, że akcja zwraca pogląd, próbowałem zmiany typu działaniem niczym ...

@RequestMapping("/error") 
public ModelAndView throwsErrorPage(Locale locale, ModelAndView mv) { 
    logger.info("Errorpage action..." + locale.getLanguage());    
    return mv.setViewName("/Errorpages/ErrorPage"); 
} 

Ale to nie działa tak dobrze ...


Strange rzecz

jest to, że jeśli zadzwonię do akcji przez localhost:8080/error, to z pewnością wywoła akcję i zwróci oczekiwaną stronę błędu. Cóż, powinny istnieć pewne różnice między przekierowaniem a typową prośbą przez wpisanie czegoś na adres url lub ajax.


Co chcę wiedzieć

  1. Jak mogę dokonać <error-page> pracę konfiguracji?
  2. Jakie są różnice między automatycznym przekierowaniem przez Spring a typowym żądaniem z działania użytkownika w Spring MVC?

Odpowiedz

0
<error-page> 
<exception-type>java.lang.Exception</exception-type> 
<location>/error.jsp</location> 
</error-page> 

strona błędu nie można umieścić w WEB-INF, wyprowadzić i wypróbować wiele

+0

Usunięcie strony błędu nie było odpowiedzią, przepraszam. Typ wyjątku nie ma związku z moim problemem. – hina10531

0
<error-page> 
    <error-code>500</error-code> 
    <location>/error.jsp</location> 
</error-page> 
<error-page> 
    <error-code>400</error-code> 
    <location>/index.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 

trzeba umieścić swój errorpages.jsp poza WEB_INF dany ch R i po prostu umieść następujący kod w swoim pliku web.xml.

+0

Próbowałem tego również, ale to nie działało tak dobrze ... niestety: [ – hina10531

0

Czy możesz sprawdzić konfigurację serwlet-context.xml. Dla mnie działa z następującą konfiguracją.

<servlet-mapping> 
    <servlet-name>appServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
    <url-pattern>*.*</url-pattern> 
    <url-pattern>*.do</url-pattern> 
</servlet-mapping> 
<error-page> 
    <error-code>404</error-code> 
    <location>/error404</location> 
</error-page> 

a kontroler wiosna metoda

@RequestMapping(value = "/error404", method = RequestMethod.GET) 
public String error() { 
    logger.info("in error method"); 
    return "/errorPages/error404"; 
} 

i jeśli chcesz określić lokalizację JSP w web.xml można określić, czy tam jeszcze można dodać adres URL. Jeśli dodasz adres URL, DispatcherServlet zajmie się odpowiedzią na przeglądarkę, jeśli podasz jsp, będzie to wyglądało jak normalna odpowiedź serwletu.

Sprawdź to w servlet-context.xml

<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory --> 
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
    <beans:property name="prefix" value="/WEB-INF/views/" /> 
    <beans:property name="suffix" value=".jsp" /> 
</beans:bean> 
1

błąd Strona rozmiar musi> 1024 bajtów.
Dodaj cokolwiek nieprzydatnego do strony błędu dla testu.
Dodaj to, aby upewnić się, że strona błędu ma ten atrybut: [isErrorPage="true"]