我有一个春季启动应用程序。
我有一个自定义错误控制器,它映射到使用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 方法不能被调用,因为它的返回类型与原始控制器方法不同)。
这是已经解决的事情了吗?
问题是我自己的错。我试图弄清楚为什么我的@ExceptionHandler
无法捕获我的异常并返回 JSON - 正如我在问题末尾所建议的那样,我认为由于返回类型冲突而出现问题 - 这是不正确的。
我尝试让异常处理程序返回 JSON 时遇到的错误如下:
"exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
"message": "Could not find acceptable representation"
我做了更多的挖掘/实验来尝试缩小问题的范围(认为问题是因为我处于 Spring 错误处理流程和ErrorController
这是导致问题的原因),但是问题只是因为 Spring 所做的内容协商工作。
因为我的errorPage映射在web.xml
正在映射到/error/404.html
,Spring 使用后缀来解析适当的视图 - 所以当我尝试返回 json 时它失败了。
我已经能够通过将 web.xml 更改为来解决该问题/error/404
或者通过关闭内容协商后缀选项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)