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{
}
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
@vallismortis Obecną najlepszą praktyką jest rozszerzenie AbstractAnnotationConfigDispatcherServletInitializer? Ho-hum. –