Spring MVC中的异常处理
Exception Handling in Spring MVC
详细地介绍了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
可以用@ControllerAdvice
和HandlerExceptionResolver
。
...
REST API的错误处理
Spring MVC REST Exception Handling Best Practices (part 1)
文章推荐了一种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
也方便后续在代码中定位错误。
message
是code
的具体描述信息。它(可以)和code
一一对应。
同一code的message在不同的locale下可以是不同的值。翻译的信息可以放在json或者XML文件里。
developerMessage
和moreInfo
相比之下没有那么重要。
实现时,可以设计一个异常类,BusinessException(HttpStatus status, String code)
;
然后实现一个HandlerExceptionResolver。