2015-02-18 14 views
1

У меня есть приложение для загрузки весны с угловым фронтом.spring mvc поймать весь маршрут, но только неизвестные маршруты

Я использую ui-router с режимом html5, и мне хотелось бы, чтобы весна отображала тот же index.html на всех неизвестных маршрутах.

// Works great, but it also overrides all the resources 
@RequestMapping 
public String index() { 
    return "index"; 
} 

// Seems do be the same as above, but still overrides the resources 
@RequestMapping("/**") 
public String index() { 
    return "index"; 
} 

// Works well but not for subdirectories. since it doesn't map to those 
@RequestMapping("/*") 
public String index() { 
    return "index"; 
} 

Так что мой вопрос в том, как я могу создать резервное сопоставление, но которое позволяет через ресурсы?

+0

Для этого нужно использовать HandlerInterceptor –

+0

сценарий tcharaf работает для меня –

ответ

1

Определить точку входа для всех URL-адресов в файле web.xml, как следующее:

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

Это поймать все 404 т.е. страницы, не найденных ошибок и бросить /Error_404 URL, поймать его в контроллере и толчке на желаемое место.

+1

У меня нет web.xml, так как это приложение для загрузки весны. Как я могу сделать это весной? –

+0

Обратитесь к http://www.sporcic.org/2014/05/custom-error-pages-with-spring-boot/, эта ссылка может помочь. –

1

Вы можете обрабатывать все несоответствующие запросы в обработчике 404. Посмотрите на this, есть несколько вариантов

Другая вещь, которую вы могли бы сделать, это переопределить DefaultAnnotationHandlerMapping, и добавить вроде броской всех контроллера, установив defaultHandler свойства.

public void setDefaultHandler(Object defaultHandler)
Установить обработчик по умолчанию для этого отображения обработчика. Этот обработчик будет возвращен, если не обнаружено никакого конкретного сопоставления. По умолчанию null, что указывает на отсутствие обработчика по умолчанию.

+0

DefaultAnnotationHandlerMapping Устаревший весной 3.2 в пользу RequestMappingHandlerMapping. Я не могу найти defaultHandler в новом обработчике :( –

+0

Собственно, 'defaultHandler' определен в [AbstractHandlerMapping] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/ web/servlet/handler/AbstractHandlerMapping.html), который также расширяет «RequestMappingHandlerMapping», поэтому он все равно должен работать. –

2

попробуйте использовать @ExceptionHandler в вашем контроллере, измените класс Exception.class классом исключения, с которым вы хотите обработать.

@ExceptionHandler(value = {Exception.class}) 
public String notFoundErrorHandler() { 
    return "index"; 
} 
+1

Кажется, что он не работает, у меня такая же проблема, как у создателя вопроса, этот сценарий не подходит для меня –

+0

что ваша проблема точно? – tcharaf

+1

Спасибо за вопрос, я уже решил свою проблему. Проблема была в конфликте с этой конструкцией и переопределила метод configureDefaultServletHandling в mvc configurrer –

3

Самый простой способ, которым я нашел, - это реализовать пользовательскую страницу 404.

@Configuration 
public class MvcConfig { 

    @Bean 
    public EmbeddedServletContainerCustomizer notFoundCustomizer(){ 
     return new NotFoundIndexTemplate(); 
    } 

    private static class NotFoundIndexTemplate implements EmbeddedServletContainerCustomizer { 
     @Override 
     public void customize(ConfigurableEmbeddedServletContainer container) { 
      container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/")); 
     } 
    } 
} 

Нил Макгиган propopes в HandlerInterceptor, но я был не в состоянии понять, как это будет реализовано. Мне было бы здорово увидеть, как это будет реализовано, поскольку одностраничные приложения, использующие html5 history push state, захотят этого поведения. И я на самом деле не нашел примеров этой проблемы.

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