0

Мне нужно иметь контроллер (или другой компонент), который обрабатывает все ошибки 404 и гибко перенаправляет на правильную страницу (это основано на таблице src/target). Я нашел несколько вопросов об обработке брошенные исключения из контроллеров, так что я сделал следующее:Spring Boot Web-приложение - контроллер перенаправления

@ControllerAdvice 
public class ServiceExceptionHandler extends ResponseEntityExceptionHandler { 

    @ExceptionHandler(Throwable.class) 
    @ResponseBody 
    ResponseEntity<String> handleControllerException(HttpServletRequest req, Throwable ex) { 

     String slug = req.getRequestURI(); // this is the URL that was not found 
     URI location=null; 
     try { 
      // lookup based on slug ... 
      location = new URI("http://cnn.com"); // let's say I want to redirect to cnn 
     } catch (URISyntaxException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     HttpHeaders responseHeaders = new HttpHeaders(); 
     responseHeaders.setLocation(location); 
     return new ResponseEntity<String>("Page has permanently moved", responseHeaders, HttpStatus.PERMANENT_REDIRECT); 


    } 
} 

Я не сделал какой-либо другой конфигурации изменения

двух вопросов с этого:

  • Он ловит исключения, брошенные другими моими контроллерами, а не 404 ошибки
  • Он ловит ВСЕ типы исключений, а не только 404

Любые идеи о том, как реализовать своего рода «уловку»?

+0

http://stackoverflow.com/questions/28902374/spring-boot-rest-service-exception-handling –

ответ

0

Это, вероятно, не лучшее решение для загрузки Spring, но, возможно, подобная идея может быть экстраполирована и применена к вашему приложению. У меня была аналогичная проблема при работе с Spring 3.x, и вот решение, которое я придумал.

Мой сценарий состоял в том, что у меня было несколько сервлетов, работающих под одним и тем же контекстом приложения. Один из них обработал веб-интерфейс, а другой обработал вызовы API. Я хотел, чтобы сервлет обрабатывал вызовы API для обработки 404s иначе, чем сервлет UI.

Я создал новый класс, который расширил DispatcherServlet и переопределил метод noHandlerFound. Я связал свой новый класс в своем web.xml в тегах <servlet> вместо класса DispatcherServlet по умолчанию, который у меня был там раньше.

<servlet> 
    <servlet-name>api-servlet</servlet-name> 
    <servlet-class>path.to.your.new.DispatcherServletClass</servlet-class> 
    ... 
</servlet> 
+0

Это не "Boot" путь. Ваш код - это просто определение сервлета. Я бы отказался от голосования, если не был установлен. – checklist

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