在 Spring-Boot 中,除了普通的 Controller 之外,我还想要一个 Controller ,它可以捕获所有未知的请求。 (也称为“后备 Controller ”或“默认 Controller ”)
这对我有用:
@Controller
public class Default {
@RequestMapping()
public @ResponseBody def() {
return "default";
}
}
但是如果我调用静态资源,它们也会解析到这个默认 Controller 。
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 提供静态内容并拥有默认 Controller ?
最佳答案
删除“catch-all”处理程序方法并显式处理 404 错误。
您需要自定义容器行为并注册一个将在 404 NOT FOUND
上解析的 View (请参阅 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"));
}
}
在 Controller 中映射/404
。请注意,“catch-all”处理程序方法已被删除:
@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";
}
}
关于Spring-Boot:默认 Controller 避免加载静态资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35179085/