在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,提供静态内容并拥有默认控制器?
答案 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";
}
}