Spring Boot Web应用程序 - 重定向控制器

时间:2016-05-04 06:09:31

标签: spring spring-mvc error-handling spring-boot http-status-code-404

我需要一个控制器(或其他组件)来处理所有404错误并巧妙地重定向到正确的页面(这是基于表src / target)。我发现了一些关于处理抛出异常FROM控制器的问题,所以我做了以下几点:

@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

关于如何实现一种“全能”的任何想法?

1 个答案:

答案 0 :(得分:0)

这可能不是最好的Spring启动解决方案,但也许类似的想法可以从它推断并应用到您的应用程序。使用Spring 3.x时遇到了类似的问题,这是我提出的解决方案。

我的方案是我在同一个应用程序上下文中运行了多个servlet。其中一个处理了Web界面,另一个处理了API调用。我希望处理API调用的servlet以不同于UI servlet的方式处理404.

我创建了一个扩展DispatcherServlet的新类,并重写了noHandlerFound方法。我在我的web.xml中用<servlet>标签连接我的新类,而不是之前我在那里的默认DispatcherServlet类。

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