【问题标题】:Change mediatype of Spring errors更改 Spring 错误的媒体类型
【发布时间】:2014-07-01 15:23:49
【问题描述】:

我正在运行一个简单的 spring-boot web 应用程序 api。问题是当我抛出异常,或者spring抛出异常时,异常总是在Http中抛出,springs默认错误页面。 有没有办法让错误默认为另一种媒体类型,比如 JSON? 基本上我总是想要 json,即使有错误。 我不想为每个异常类型编写一个自定义的@ExceptionHandler,因为那太糟糕了..

更新:这是我目前正在尝试的:

@ControllerAdvice
@EnableAutoConfiguration
public class ErrorWritter extends ResponseEntityExceptionHandler {

  @Override
  public ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
    String response = "{\"status\":\""
        + status.toString()
        + "\",\"generic message\":\""
        + status.getReasonPhrase()
        + "\",\"specific message\":\""
        + ex.getMessage()
        + "\" }";

    return new ResponseEntity<Object>(response, headers, status);
  }
}

但这似乎并没有做任何事情。为了让spring认识到我希望它使用它,我需要做些什么吗?

请注意:我使用的是 Java 配置而不是 xml 配置。

【问题讨论】:

    标签: java spring spring-mvc spring-boot


    【解决方案1】:

    以下文章中有很好的信息: http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

    您可以为您的错误创建一个模型,例如:

    public class ErrorInfo {
        public final String url;
        public final String ex;
    
        public ErrorInfo(String url, Exception ex) {
            this.url = url;
            this.ex = ex.getLocalizedMessage();
        }
    }
    

    以及使用返回该模型表示的错误处理程序:

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(MyBadDataException.class)
    @ResponseBody ErrorInfo handleBadRequest(HttpServletRequest req, Exception ex) {
        return new ErrorInfo(req.getRequestURL(), ex);
    } 
    

    如果您想了解更多关于 @ExceptionHandler 在 spring 中如何工作的详细信息,请查看 spring 文档: http://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-exceptionhandlers

    【讨论】:

    • 如何让它也处理 Spring 本身抛出的错误?
    • 在同一篇文章中,您会发现对@ControllerAdvice 的引用。这是全局使用@ExceptionHandler 的最佳方式。
    • @pragmatical @DaveSyer 好的,文章说我所要做的就是扩展ResponseEntityExceptionHandler,但它对如何正确执行它并不是很具体。我用到目前为止的内容编辑了上面的问题。
    • 一个简单的@ControllerAdvice 和一个@ExceptionHandler 对于所有例外情况怎么样?在请求属性中填充您需要的任何状态,然后转发到普通 MVC @Controller,您可以在其中使用普通内容协商呈现 JSON 或 HTML 视图或任何您喜欢的内容。
    • P.S. Spring Boot 几乎可以为您做到这一点(在 1.1 中几乎是字面意思,在 1.0 中如果您使用 Actuator 会发生类似的事情)。
    猜你喜欢
    • 2017-01-24
    • 2015-06-18
    • 2021-10-12
    • 2016-09-10
    • 2014-02-06
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多