2016-04-20 4 views
0

Я бегу Spring 4 веб MVC проекта:@ControllerAdvice конфликт с ResourceHandler: Spring 4

Редакция: Мой controlleradvice для 404 обработчика исключений не работает. Однако, если я прокомментирую метод addResourceHandlers в классе WebConfig, он будет работать. (Я не могу удалить, что, как он решает свои статические ресурсы) _

Это мой веб-конфигурация:

@EnableWebMvc 
@Configuration 
public class WebConfig extends WebMvcConfigurerAdapter { 

    /* 
    * Resource handler for static resources 
    */ 
    @Override 
    public void addResourceHandlers(final ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/**").addResourceLocations("classpath:/static/"); 
    } 
} 

И это мой обработчик 404 Исключения:

@ControllerAdvice 
public class ExceptionController { 

    @ExceptionHandler(NoHandlerFoundException.class) 
    public String handle404(Exception e) { 
     return "error/404"; 
    } 
} 

ответ

1

Если веб-приложение использует web.xml, это очень просто - просто добавьте следующее (при использовании InternalResourceViewResolver с префиксом, указывающим на ваш WEB-INF просмотр папки и суффикса .jsp). У вас также может быть несколько элементов страницы ошибок других кодов ошибок.

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

Если вы не используете web.xml, это немного сложнее.

Если вы хотите поймать исключение NoHandlerFound, вы сначала должны сообщить Весне, чтобы бросить его через setting a flag in the DispatcherServlet directly.

Для этого в классе, который вы простирающейся AbstractAnnotationConfigDispatcherServletInitializer переопределить метод onStartup выставить определение DispatcherServlet и вручную добавить нужный флаг:

@Override 
public void onStartup(ServletContext servletContext) throws ServletException { 

    //... 
    WebApplicationContext context = getContext(); 
    DispatcherServlet dispatcherServlet = new DispatcherServlet(context); 
    //we did all this to set the below flag 
    dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); 
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet",dispatcherServlet); 
    //.. 
} 

Тогда ваш существующий код в ExceptionController должен работать и перехватить exception

+0

Я уже устанавливаю throwExceptionIfNoHandlerFound true в методе onStartup, и он работает, когда я удаляю метод addResourceHandlers из WebConfig. Я не могу использовать их обоих вместе. – kukkuz

+0

Возможно, это связано с тем, что у вас есть setup registry.addResourceHandler ("/ **"), который включает в себя все. Судя по местоположению вашего ресурса, не можете ли вы определить registry.addResourceHandler ("/ static/**"), чтобы сузить статический контент? – dimitrisli

+0

:) Вот и все. Большое спасибо. Не могли бы вы сообщить мне, почему он столкнулся? – kukkuz