2014-01-24 4 views
8

Какие опции мне нужно поймать и обрабатывать 404 без использования web.xml. Это, как я определяю мой Servlet:Spring 3.2 servlet 3.0 Конфигурация Java (без web.xml), как создать пользовательский обработчик 404

@Order(1) 
public class MyWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { 

    // 10MB 
    private static final int MAX_UPLOAD_SIZE_IN_MB = 10 * 1024 * 1024; 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] { RootConfiguration.class }; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[] { WebConfiguration.class }; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] { "/" }; 
    } 

    @Override 
    protected Filter[] getServletFilters() { 
     return new Filter[] { new SiteMeshFilter() }; 
    } 

    @Override 
    protected void customizeRegistration(ServletRegistration.Dynamic registration) { 
     MultipartConfigElement multipartConfigElement = new MultipartConfigElement("/tmp", MAX_UPLOAD_SIZE_IN_MB, MAX_UPLOAD_SIZE_IN_MB * 2, 
       MAX_UPLOAD_SIZE_IN_MB/2); 
     registration.setMultipartConfig(multipartConfigElement); 
    } 

} 

Мое приложение все настроено в Java коде, @ControllerAdvice отлично работает со всеми другими исключениями, как:

BindException.class, MethodArgumentNotValidException.class, MissingServletRequestParameterException.class, 
MissingServletRequestPartException.class, HttpMessageNotReadableException.class, TypeMismatchException.class 

однако

@ControllerAdvice 
public class SomeClass { 
... 
    @ExceptionHandler(value = { ResourceNotFoundException.class, NoSuchRequestHandlingMethodException.class }) 
    public ModelAndView handle404() { 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.setViewName("/errors/404"); 
     modelAndView.addObject("exception", "404 NOT FOUND!"); 
     return modelAndView; 
    } 
... 
} 

делает НЕ catch 404 Я также пробовал HttpStatus ... без везения

, когда я звоню/someUrlThatDoesNotExist:

[DEBUG] 2014-01-24 10:03:16,639 org.springframework.security.web.FilterChainProxy doFilter - /someUrlThatDoesNotExist reached end of additional filter chain; proceeding with original chain 
[DEBUG] 2014-01-24 10:03:16,640 org.springframework.web.servlet.DispatcherServlet doService - DispatcherServlet with name 'dispatcher' processing GET request for [/someUrlThatDoesNotExist] 
[DEBUG] 2014-01-24 10:03:16,641 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping getHandlerInternal - Looking up handler method for path /someUrlThatDoesNotExist 
[DEBUG] 2014-01-24 10:03:16,662 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping getHandlerInternal - Did not find handler method for [/someUrlThatDoesNotExist] 
[WARN] 2014-01-24 10:03:16,663 org.springframework.web.servlet.PageNotFound noHandlerFound - No mapping found for HTTP request with URI [/someUrlThatDoesNotExist] in DispatcherServlet with name 'dispatcher' 
[DEBUG] 2014-01-24 10:03:16,665 org.springframework.web.servlet.DispatcherServlet processRequest - Successfully completed request 

, но когда я пытаюсь осмотреть ниже точки отреза с помощью АОП:

org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleHttpRequestMethodNotSupported(..) 
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver.handleNoSuchRequestHandlingMethod(..) 

они никогда не поймают ..

ответ

2

Я считаю, что вам нужно настроить ваш DispatcherServlet, чтобы выбросить исключение, если не найдено ни одного обработчика

dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); 

, а затем введите @ControllerAdvice. @ExceptionHandler за исключением типа NoHandlerFoundException.

+0

У вас есть пример, как это сделать с AbstractAnnotationConfigDispatcherServletInitializer? –

+0

@marcin У меня нет доступа к коду прямо сейчас, но этот класс должен иметь метод configureDispatcherServlet(), который вы можете переопределить для этого. –

+0

Sotirios Delimanolis Я думаю, что setThrowExceptionIfNoHandlerFound доступен только весной 4.0, а не 3.2.6 dispatcherServlet –

Смежные вопросы