【发布时间】:2015-06-24 13:58:33
【问题描述】:
我有一个 Spring Boot 应用程序。
我有一个自定义错误控制器,它使用ErrorPage 映射映射到。映射主要基于 HTTP 状态代码,通常只是适当地呈现 HTML 视图。
比如我的映射:
@Configuration
class ErrorConfiguration implements EmbeddedServletContainerCustomizer {
@Override public void customize( ConfigurableEmbeddedServletContainer container ) {
container.addErrorPages( new ErrorPage( HttpStatus.NOT_FOUND, "/error/404.html" ) )
}
还有我的错误控制器:
@Controller
@RequestMapping
public class ErrorController {
@RequestMapping( value = "/error/404.html" )
@ResponseStatus(value = HttpStatus.NOT_FOUND)
public String pageNotFound( HttpServletRequest request ) {
"errors/404"
}
这很好 - 如果我只是输入一个随机的不存在的 URL,那么它会呈现 404 页面。
现在,我想要我网站的一部分,比如说/api/..,它专门用于我的 JSON api,以将错误作为 JSON 提供,所以如果我在 /api/.. 下输入一个随机不存在的 URL,那么它返回 404 JSON 响应。
是否有任何标准/最佳方法可以做到这一点?我尝试的一个想法是有一个@ControllerAdvice 专门捕获我定义并返回 JSON 的一类自定义 API 异常,并在我的标准 ErrorController 检查 URL 并在该 API URL 空间下抛出一个适当的 API 异常(但是这不起作用,因为无法调用 ExceptionHandler 方法,因为它与原始控制器方法的返回类型不同)。
这件事已经解决了吗?
【问题讨论】:
-
您能否详细说明您的最后陈述?不清楚您所说的 could not be invoked because it is a different return type 是什么意思。
-
感谢@zeroflagL - 我应该添加更多细节 - 我现在不在代码中,但是当我回来时会添加更多细节......这是我在测试时看到的更多观察到的行为,但并不详尽。。另一种可能性是,因为抛出代码在 ErrorController 中(所以已经在 springs 错误处理过程中),ControllerAdvice 的工作方式不同
标签: java spring spring-mvc spring-boot