2016-03-14 44 views
5

Tôi muốn xử lý ngoại lệ 404 trang không tìm thấy trong ứng dụng web Spring MVC của mình, tôi đang sử dụng SPRING 4.2.5.RELEASE, tôi đã đọc một số câu hỏi liên quan đến chủ đề này nhưng các câu hỏi tương tự đang sử dụng cấu hình java mùa xuân khác.Cách xử lý ngoại lệ trang 404 không tìm thấy trong Spring MVC với cấu hình java và không có Web.xml

Tôi có lớp Bộ điều khiển xử lý ngoại lệ toàn cầu có tất cả ngoại lệ, lớp này hoạt động tốt nhưng tôi không thể xử lý ngoại lệ cho trang 404 không tìm thấy.

Đây là phương pháp mà tôi mất sau một hướng dẫn

1) Tôi tạo ra một lớp có tên ResourceNotFoundException mà kéo dài từ RuntimeException và tôi putted chú thích này trong định nghĩa lớp @ResponseStatus(HttpStatus.NOT_FOUND)

như thế này:

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

} 

2) Tôi đã tạo phương thức này trong lớp điều khiển ngoại lệ của tôi

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

    return "notFoundJSPPage"; 
} 

Nhưng vẫn khi tôi đặt một URL không tồn tại Tôi nhận được lỗi này "Không có ánh xạ tìm thấy cho yêu cầu với URI HTTP"

Các câu hỏi mà tôi đã đọc nói rằng tôi cần phải kích hoạt để đúng một tùy chọn cho Người điều phối nhưng vì cấu hình của tôi khác với các câu hỏi khác và tôi không có số Web.xml tôi không thể áp dụng điều đó.

Đây là Cấu hình của tôi.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; 
    } 

} 

Đây là WebInitializer tôi

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


    } 
} 

Dưới đây là toàn cầu điều khiển ngoại lệ Handler tôi

@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"; 
    } 

} 

Và lớp tôi tạo ra mà kéo dài Runtime Exception

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

} 

Trả lời

6

tôi solv ed vấn đề bằng cách đặt dòng này trong phương pháp onStartup tôi trong WebApplicationInitializer.class

này đó là dòng tôi thêm servlet.setInitParameter("throwExceptionIfNoHandlerFound", "true");

đây là cách có vẻ phương pháp hoàn chỉnh với các dòng sản phẩm mới tôi đã thêm

@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"); 
} 

Sau đó, tôi đã tạo phương pháp điều khiển này trong số GlobalExceptionHandlerController.class

@ExceptionHandler(NoHandlerFoundException.class) 
@ResponseStatus(HttpStatus.NOT_FOUND) 
public String handle(NoHandlerFoundException ex) { 

    return "my404Page"; 
} 

và giải quyết được sự cố của tôi xóa các phương pháp điều khiển handleResourceNotFoundException trong GlobalExceptionHandlerController.class của tôi vì nó là không cần thiết và tôi cũng xóa các lớp ngoại lệ ResourceNotFoundException.class mà tôi tạo ra

+0

này công việc, nhưng thực tiễn tốt nhất hiện tại (tính đến Mùa xuân 4.2.3) được mô tả trong [câu trả lời này] (http://stackoverflow.com/a/31436535/2074605). – vallismortis

+0

@vallismortis Thực tiễn tốt nhất hiện tại là mở rộng AbstractAnnotationConfigDispatcherServletInitializer? Ho-hum. –

1

Bạn cũng có thể mở rộng AbstractAnnotationConfigDispatcherServletInitializer và ghi đè phương pháp này:

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

HOẶC này:

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

Và cuối cùng trong ControlerAdvice sử dụng của bạn này:

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

    return new ModelAndView("404"); 
} 
1

Tôi thấy rằng câu trả lời của zygimantus không hoạt động vì một lý do nào đó, vì vậy nếu bạn cũng có cùng một vấn đề, thì thay vì khai báo "@ExceptionHandler", hãy thêm một trong số đó vào lớp "@Configuration". Tôi đặt mỏ WebMvcConfigurerAdapter tôi

@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; 
    } 

Nhưng chắc chắn rằng bạn cũng làm theo phần còn lại của zygimantus tức

dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); 
0

Thêm đoạn mã sau vào bất kỳ bộ điều khiển và tạo một trang 404 nên

@GetMapping("/*") 
public String handle() { 
    return "404"; 
} 
Các vấn đề liên quan