-
4.当前请求区域设置的java.util.Locale
-
5.java.io.InputStream / java.io.Reader访问请求的内容
(参考翻译来自源码的文档)
目前只用过第一种,用来处理异常。 回顾之前java异常处理 主要有这几个关键字:try catch finally throw throws 如果要抛出具体明确的异常,则可以用 try catch来捕捉,若有些异常不做处理 直接抛出,则可以使用 throw(主要是在语句抛出),throws(主要是在方法上抛出);试想以前的代码,有时一段代码,业务逻辑如果复杂,一个try就有多个catch,代码看起来就给人一种很冗余的感觉;使用@RestControllerAdvice @ExceptionHandler统一拦截异常处理 争对不同的异常抛出,我可以做不同的异常拦截,对拦截的异常信息做统一处理(统一数据格式)再返回前端,即使发生错误,错误信息的可读性也好,也能更快锁定问题。
插曲:
@RestControllerAdvice 和 @ControllerAdvice有何区别? 如下是@RestControllerAdvice注解的源码,可以看出@RestControllerAdvice包含了 @ControllerAdvice+@ResponseBody两个注解,若要使用@ControllerAdvice结合@ExceptionHandler作为异常统一拦截(返回json数据格式),则需要再加一个注解@ResponseBody
2.举例
- 2.1 统一异常处理
@RestControllerAdvice
@Slf4j
@Order(Ordered.HIGHEST_PRECEDENCE)
public class OverallExceptionHandler {
@ExceptionHandler
public CommonResult handException(Exception e){
return CommonResult.errorResult(ResultCode.SYSTEM_ERROR,e.getMessage());
}
@ExceptionHandler(value = UserException.class)
public CommonResult handUserExceptionHandler(UserException e){
return CommonResult.customErrorResult(null,e.getMessage(),null);
}
/**
- 参数不可读
*/
@ExceptionHandler(value = HttpMessageNotReadableException.class)
public CommonResult handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
return CommonResult.errorResult(ResultCode.PARAM_IS_INVALID, e.getMessage());
}
}
复制代码
handException方法主要拦截:没有被拦截处理的异常信息
handUserExceptionHandler:拦截主动抛出的异常信息(这个异常是自己自定义的异常信息)
handleHttpMessageNotReadableException:拦截参数不可读异常 这个异常时jdk里面自带的异常(正如上面所说 对于不同的异常 可以做不同的拦截处理,返回的错误信息也可以自己自定义 这样的错误提示能更快定位问题)
- 2.2 自定义异常
public class UserException extends RuntimeException{
private static final long serialVersionUID = 1L;
private String code;
public UserException() {
super();
}
public UserException(String message) {
super(message);
this.code = ResultCode.EXISTING_ASSOCIATED_DATA.getCode();
}
public UserException(String code, String message){
super(message);
this.code = code;
}
public UserException(String message, Throwable cause) {
super(message, cause);
}
public UserException(Throwable cause) {
super(cause);
}
}
复制代码
自定义异常 有些异常java中可能没包含的异常 自己也可以自定义 这些异常也可用拦截器进行拦截处理 只需要@ExceptionHandler(value = UserException.class)这样就可以拦截到自定义的异常
- 2.3 controller层写的一个测试方法
@PostMapping(value = "/testException")
public void test1(){
throw new UserException("这是我抛出得一个异常");
}
复制代码
这个异常只是一个测试(自定义的异常) 直接抛除一个异常 这个异常会被统一拦截器做拦截处理 其返回的内容如下(返回了一个标准的json数据格式):
再看一个例子: 这个是java自带的异常 若抛出异常 则回被拦截到handException方法里做相应的处理:
@PostMapping(value = "/testException")
public void test1() throws FileNotFoundException {
File file = new File("D:222.pdf");
FileInputStream inputStream = new FileInputStream(file);
复制代码
也返回的时标准的json数据格式:
而如果用try-catch去做处理:
@PostMapping(value = "/testException")
public void test1(){