Spring MVC中的异常处理

2017 Feb 26

详细地介绍了Spring MVC中的异常处理。

Per Exception
 @ResponseStatus(value=HttpStatus.NOT_FOUND, reason="No such Order")
 public class OrderNotFoundException extends RuntimeException { }
Per Controller
@Controller
public class ExceptionHandlingController {
  @ResponseStatus(value=HttpStatus.CONFLICT,
                  reason="Data integrity violation")  // 409
  @ExceptionHandler(DataIntegrityViolationException.class)
  public void conflict() {
  
  }
}
Globally

可以用@ControllerAdviceHandlerExceptionResolver

REST API的错误处理

2017 Feb 26

文章推荐了一种REST API发生错误时HTTP body的格式。

{
    "status": 404,
    "code": 40483,
    "message": "Oops! It looks like that file does not exist.",
    "developerMessage": "File resource for path /uploads/foobar.txt does not exist.  Please wait 10 minutes until the upload batch completes before checking again.",
    "moreInfo": "http://www.mycompany.com/errors/40483"
}

status的值就是HTTP status code。

code是应用程序内部的错误代码。 表示错误的HTTP status code最多只有几十种,不能再细分到底是哪段业务逻辑发生了错误;而code的值空间是无限的。 同时code也方便后续在代码中定位错误。

messagecode的具体描述信息。它(可以)和code一一对应。 同一code的message在不同的locale下可以是不同的值。翻译的信息可以放在json或者XML文件里。

developerMessagemoreInfo相比之下没有那么重要。

实现时,可以设计一个异常类,BusinessException(HttpStatus status, String code); 然后实现一个HandlerExceptionResolver