我有一个春季启动应用程序.
我有一个自定义错误控制器,映射到使用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专门捕获了我定义的一类自定义API异常并返回了JSON,并且在我的标准ErrorController中检查URL并在该API URL空间下抛出apprpriate API异常(但是不起作用,因为无法调用ExceptionHandler方法,因为它是与原始控制器方法不同的返回类型).
这件事已经解决了吗?
最佳答案
问题是我自己的错.我试图弄清楚为什么我的@ExceptionHandler无法捕获我的异常并返回JSON – 正如我在问题的最后建议的那样,我认为由于返回类型冲突我遇到了问题 – 这是不正确的.
我试图让我的异常处理程序返回JSON的错误是:
"exception": "org.springframework.web.HttpMediaTypeNotAcceptableException","message": "Could not find acceptable representation"
我做了一些挖掘/试验以试图缩小问题范围(认为问题是因为我在Spring错误处理流程和导致问题的ErrorController中),但问题只是因为内容协商东西春天呢.
因为我在web.xml中的errorPage映射映射到/error/404.html,所以Spring使用后缀来解析相应的视图 – 所以当我尝试返回json时它会失败.