2016-03-14 9 views
5

Chcę obsłużyć 404 stron nie znaleziono wyjątek w mojej aplikacji sieci web Wiosna MVC, używam SPRING 4.2.5.RELEASE, Czytałem kilka pytań dotyczących ten temat, ale podobne pytania używają innej konfiguracji Java java.Sposób obsługi strony 404 nie znaleziono wyjątku w Spring MVC z konfiguracją java i bez Web.xml

Mam klasę kontrolera obsługi wyjątków globalnych, które mają wszystkie moje wyjątki, ta klasa działa dobrze, ale nie mogę obsłużyć wyjątku strona nie znaleziono 404.

To jest podejście, że biorę po tutorialu

1) I stworzył klasę o nazwie ResourceNotFoundException który rozciąga się od RuntimeException a ja putted tej adnotacji nad definicją klasy @ResponseStatus(HttpStatus.NOT_FOUND)

tak:

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class ResourceNotFoundException extends RuntimeException { 

} 

2) Ta metoda została utworzona w klasie kontrolera mojego wyjątku:

@ExceptionHandler(ResourceNotFoundException.class) 
@ResponseStatus(HttpStatus.NOT_FOUND) 
public String handleResourceNotFoundException() { 

    return "notFoundJSPPage"; 
} 

Ale jeszcze kiedy mogę umieścić adres URL, który nie istnieje otrzymuję ten błąd „Nie znaleziono mapowanie żądania HTTP z URI”

Pytania, które czytałem powiedział, że muszę włączyć true opcja dla Dispatchera, ale ponieważ moja konfiguracja różni się od innych pytań i nie mam Web.xml, nie mogłem tego zastosować.

Oto moja konfiguracja.java

@EnableWebMvc 
@Configuration 
@ComponentScan({"config", "controllers"}) 
public class ConfigMVC extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/resources/**").addResourceLocations("/WEB-INF/resources/"); 
    } 

    @Bean 
    public UrlBasedViewResolver setupViewResolver() { 
     UrlBasedViewResolver resolver = new UrlBasedViewResolver(); 
     resolver.setPrefix("/WEB-INF/jsp/"); 
     resolver.setSuffix(".jsp"); 
     resolver.setViewClass(JstlView.class); 
     return resolver; 
    } 

} 

Oto moja WebInitializer

public class WebInicializar implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(ConfigMVC.class); 
     ctx.setServletContext(servletContext); 
     Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     servlet.addMapping("/"); 
     servlet.setLoadOnStartup(1); 


    } 
} 

Oto moja Globalny Exception Handler Controller

@ControllerAdvice 
public class GlobalExceptionHandlerController { 


    @ExceptionHandler(value = NullPointerException.class) 
    public String handleNullPointerException(Exception e) { 

     System.out.println("A null pointer exception ocurred " + e); 

     return "nullpointerExceptionPage"; 
    } 


    @ResponseStatus(value = HttpStatus.INTERNAL_SERVER_ERROR) 
    @ExceptionHandler(value = Exception.class) 
    public String handleAllException(Exception e) { 

     System.out.println("A unknow Exception Ocurred: " + e); 

     return "unknowExceptionPage"; 
    } 


    @ExceptionHandler(ResourceNotFoundException.class) 
    @ResponseStatus(HttpStatus.NOT_FOUND) 
    public String handleResourceNotFoundException() { 

     return "notFoundJSPPage"; 
    } 

} 

A klasa I stworzył który rozciąga Runtime Exception

@ResponseStatus(HttpStatus.NOT_FOUND) 
public class ResourceNotFoundException extends RuntimeException{ 

} 

Odpowiedz

6

I solv ed problem poprzez umieszczenie tej linii w moim sposobie onStartup w WebApplicationInitializer.class

tym to linia dodam servlet.setInitParameter("throwExceptionIfNoHandlerFound", "true");

to, jak wygląda kompletny sposób z nowej linii I dodaje

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 
    AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
    ctx.register(ConfigMVC.class); 
    ctx.setServletContext(servletContext); 
    Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
    servlet.addMapping("/"); 
    servlet.setLoadOnStartup(1); 
    servlet.setInitParameter("throwExceptionIfNoHandlerFound", "true"); 
} 

Następnie stworzyłem tę metodę kontrolera w moim GlobalExceptionHandlerController.class usunięte metodę handleResourceNotFoundException kontrolera w moim GlobalExceptionHandlerController.class ponieważ nie było konieczne, a także Usunąłem klasa wyjątek ResourceNotFoundException.class że stworzył

+0

ta powinna działa, ale obecne najlepsze praktyki (od wiosny 4.2.3) są opisane w [tej odpowiedzi] (http://stackoverflow.com/a/31436535/2074605). – vallismortis

+0

@vallismortis Obecną najlepszą praktyką jest rozszerzenie AbstractAnnotationConfigDispatcherServletInitializer? Ho-hum. –

1

Możesz również rozszerzyć AbstractAnnotationConfigDispatcherServletInitializer i zastąpić tę metodę:

@Override 
protected DispatcherServlet createDispatcherServlet(WebApplicationContext servletAppContext) { 
    final DispatcherServlet dispatcherServlet = (DispatcherServlet) super.createDispatcherServlet(servletAppContext); 
    dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); 
    return dispatcherServlet; 
} 

LUB ten jeden:

@Override 
public void customizeRegistration(ServletRegistration.Dynamic registration) { 
    registration.setInitParameter("throwExceptionIfNoHandlerFound", "true"); 
} 

I wreszcie w ControlerAdvice użyj:

@ExceptionHandler(NoHandlerFoundException.class) 
public String error404(Exception ex) { 

    return new ModelAndView("404"); 
} 
1

Znalazłem, że odpowiedź zygimantusa nie działa z jakiegoś powodu, więc jeśli masz ten sam problem, zamiast zadeklarować "@ExceptionHandler", zamiast tego dodaj jeden z nich do klasy "@Configuration". Kładę kopalnię w moim WebMvcConfigurerAdapter

@Bean 
    public HandlerExceptionResolver handlerExceptionResolver(){ 
     HandlerExceptionResolver myResolver = new HandlerExceptionResolver(){ 

     @Override 
     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { 
       //return your 404 page 
      ModelAndView mav = new ModelAndView("404page"); 
      mav.addObject("error", exception); 
      return mav; 
     } 
     }; 
     return myResolver; 
    } 

Ale upewnij się również śledzić resztę zygimantus tj

dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); 
0

Dodaj następujący kod w dowolnym kontrolerze i utworzyć stronę 404

@GetMapping("/*") 
public String handle() { 
    return "404"; 
} 
Powiązane problemy