2012-12-16 8 views
7

powiedzmy Mam aplikacji wiosny MVC z poniższego wpisu web.xml:Uzyskiwanie adresu URL, który doprowadził do błędu (404) z kontrolera błędów widoku wiosną MVC

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

i po stronie kontrolera błędów :

@RequestMapping({"","/"}) 
@Controller 
public class RootController { 

    @RequestMapping("error/{errorId}") 
    public String errorPage(@PathVariable Integer errorId, Model model) { 
     model.addAttribute("errorId",errorId); 

     return "root/error.tile"; 
    } 
} 

teraz użytkownik o nieistniejącego adresu URL/user/pokazać/iamnotauser który wywołał kontrolera strona błędu. Jak uzyskać ten nieistniejący adres URL "/ user/show/iamnotauser" z metody ErrorPage() kontrolera RootController, aby umieścić go w modelu i wyświetlić na stronie błędu?

Odpowiedz

14

Podstęp jest atrybutem żądania javax.servlet.forward.request_uri, zawiera oryginalny żądany plik URI.

@RequestMapping("error/{errorId}") 
public ModelAndView resourceNotFound(@PathVariable Integer errorId, 
                HttpServletRequest request) { 
    //request.getAttribute("javax.servlet.forward.request_uri"); 
    String origialUri = (String) request.getAttribute(
               RequestDispatcher.FORWARD_REQUEST_URI); 

    return new ModelAndView("root/error.jspx", "originalUri", origialUri); 
} 

Jeśli nadal korzystać Servlet API 2.5, a następnie stała RequestDispatcher.FORWARD_REQUEST_URI nie istnieje, ale można użyć request.getAttribute("javax.servlet.forward.request_uri"). lub zaktualizowano do javax.servlet:javax.servlet-api:3.0.1

+0

Jesteśmy na serwerze obsługującym Servlet API 3.0.x, ale używając 2.5 w specyfikacji w web.xml. Przy takim ustawieniu powyższe podejścia nie przyniosły niczego użytecznego, ale 'request.getAttribute (" javax.servlet.error.request_uri ");' zrobił trik –

Powiązane problemy