我有一个Spring Boot应用程序。
我有一个自定义错误控制器,该控制器使用ErrorPage映射映射到。映射主要基于HTTP状态代码,通常只适当地呈现HTML视图。
ErrorPage
例如,我的映射:
@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响应。
/api/..
有什么标准/最佳方法可以做到这一点?我尝试过的一个想法是@ControllerAdvice,专门捕获一个我定义并返回JSON的自定义API异常类,然后在我的标准ErrorController中检查URL,如果在该API URL空间下,则抛出一个适当的API异常(但这没有)。可以正常工作,因为ExceptionHandler方法与原始控制器方法是不同的返回类型,因此无法调用。
@ControllerAdvice
这已经解决了吗?
问题是我自己的错。我试图弄清为什么我@ExceptionHandler无法捕获异常并返回JSON- 正如我在问题末尾所建议的那样,我认为由于返回类型冲突而导致问题-这是不正确的。
@ExceptionHandler
我尝试让异常处理程序返回JSON的错误大致如下:
"exception": "org.springframework.web.HttpMediaTypeNotAcceptableException", "message": "Could not find acceptable representation"
我做了一些进一步的挖掘/实验以试图缩小问题的范围(认为问题是因为我处于Spring错误处理流程中ErrorController,并且导致了问题),但是问题仅仅是由于内容协商的问题spring呢。
ErrorController
因为我的errorPage映射web.xml映射到/error/404.html,所以Spring使用后缀来解析适当的视图- 因此,当我尝试返回json时,它失败了。
web.xml
/error/404.html
通过将web.xml更改为/error/404或通过关闭内容协商后缀选项,我已经能够解决此问题。
/error/404