一尘不染

Spring Boot-用于处理JSON或HTML的错误控制器

spring-boot

我有一个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方法与原始控制器方法是不同的返回类型,因此无法调用。

这已经解决了吗?


阅读 260

收藏
2020-05-30

共1个答案

一尘不染

问题是我自己的错。我试图弄清为什么我@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或通过关闭内容协商后缀选项,我已经能够解决此问题。

2020-05-30