Spring-Boot:默认控制器可以避免加载静态资源

时间:2016-02-03 13:58:12

标签: spring spring-mvc spring-boot

在Spring-Boot中,除了普通控制器之外,我还需要一个能够捕获所有未知请求的Controller。 (也称为"后备控制器"或"默认控制器")

这对我有用:

@Controller
public class Default {
   @RequestMapping()
   public @ResponseBody def() {
      return "default";
   }
}

但是如果我调用静态资源,它们也会解析为这个默认控制器。

curl localhost:8080/sdkjfh -> "default" --- fine!
curl localhost:8080/test -> "test" --- fine - output of "test" controller!
curl localhost:8080/img/me.jpg -> "default" --- NOT fine! I want an image here!

如何告诉spring-boot,提供静态内容并拥有默认控制器?

1 个答案:

答案 0 :(得分:1)

删除" catch-all"处理程序方法并明确处理 404 错误。

您需要自定义容器行为并注册将在404 NOT FOUND上解析的视图(请参阅Spring Boot - Error Handling):

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer(){
    return new ErrorPagesCustomizer();
}

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

在控制器中映射/404。请注意," catch-all" handler-method已被删除:

@Controller
public class DefaultController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    @ResponseBody
    public String index() {
        return "index";
    }

    @ResponseStatus(value= HttpStatus.NOT_FOUND)
    @RequestMapping(value = "/404", method = RequestMethod.GET)
    public String handleNotFound() {
        return "default";
    }
}