繁体   English   中英

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

[英]Spring Boot - Error Controller to handle either JSON or HTML

我有一个春季启动应用程序。

我有一个自定义错误控制器,映射到使用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时它会失败。

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

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

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

我想你需要重新思考你在这里想做什么。 根据这里的 HTTP响应代码

404或Not Found错误消息是HTTP标准响应代码,表示客户端能够与给定服务器通信,但服务器无法找到所请求的内容。

因此,在键入随机URL时,您可能不希望一直抛出404。 如果您正在尝试处理错误的请求,您可以执行类似的操作

@ControllerAdvice
public class GlobalExceptionHandlerController {   

    @ExceptionHandler(NoHandlerFoundException.class)
    @ResponseStatus(value = HttpStatus.BAD_REQUEST)
    @ResponseBody
    public ResponseEntity<ErrorResponse> noRequestHandlerFoundExceptionHandler(NoHandlerFoundException e) {
        log.debug("noRequestHandlerFound: stacktrace={}", ExceptionUtils.getStackTrace(e));

        String errorCode = "400 - Bad Request";
        String errorMsg = "Requested URL doesn't exist";

        return new ResponseEntity<>(new ErrorResponse(errorCode, errorMsg), HttpStatus.BAD_REQUEST);
    }
}

构建满足您需求的ResponseEntity

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM