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

rhi*_*nds 6 java spring spring-mvc 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" ) )
  }
Run Code Online (Sandbox Code Playgroud)

我的错误控制器:

@Controller
@RequestMapping
public class ErrorController {

    @RequestMapping( value = "/error/404.html" )
    @ResponseStatus(value = HttpStatus.NOT_FOUND)
    public String pageNotFound( HttpServletRequest request ) {
        "errors/404"
    }
Run Code Online (Sandbox Code Playgroud)

这很好 - 如果我只输入一个随机不存在的URL,那么它将呈现404页面.

现在,我想要一个我的网站的一部分,让我们说/api/..我的JSON api专用于将错误作为JSON提供,所以如果我在/ api/..下输入一个随机不存在的URL,那么它会返回404 JSON响应.

有没有标准/最好的方法来做到这一点?我试过的一个想法就是有一个@ControllerAdvice专门捕获我定义的一类自定义API异常并返回JSON,并在我的标准ErrorController中检查URL并在该API URL空间下抛出apprpriate API异常(但是没有'因为它是与原始控制器方法不同的返回类型,因此无法调用ExceptionHandler方法.

这件事已经解决了吗?

rhi*_*nds 1

问题是我自己的错。我试图弄清楚为什么我@ExceptionHandler无法捕获异常并返回 JSON - 正如我在问题末尾所建议的那样,我认为由于返回类型冲突而遇到了问题 - 这是不正确的。

我尝试让异常处理程序返回 JSON 时遇到的错误如下:

  "exception": "org.springframework.web.HttpMediaTypeNotAcceptableException",
  "message": "Could not find acceptable representation"
Run Code Online (Sandbox Code Playgroud)

我做了更多的挖掘/实验来尝试缩小问题的范围(认为问题是因为我处于 Spring 错误处理流程中并且ErrorController导致了问题),但是问题只是因为内容协商的内容春天确实如此。

因为我的 errorPage 映射映射web.xml/error/404.html,Spring 使用后缀来解析适当的视图 - 所以当我尝试返回 json 时它失败了。

我已经能够通过将 web.xml 更改为/error/404或关闭内容协商后缀选项来解决该问题。