06SpringBoot中 @ControllerAdvice注解(全局异常处理)与@ModelAttribute的使用
Posted 小楼夜听雨QAQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了06SpringBoot中 @ControllerAdvice注解(全局异常处理)与@ModelAttribute的使用相关的知识,希望对你有一定的参考价值。
说明:不够详细,只是列举了常见的使用方法,如果需要详细的说明,可以参考下面的博客:
1、@ControllerAdvice
@ControllerAdvice主要和@ExceptionHandler结合使用,可以达到全局异常处理的目的,如下:
@ControllerAdvice
public class ExceptionHandlerController {
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public RestResult handlerException(HttpServletRequest request,Exception e){
RestResult restResult = new RestResult();
restResult.setCode(200);
restResult.setData("hello");
restResult.setMsg("123");
return restResult;
}
}
可以接收全局代码抛出来的异常,包括过滤器等一些非Controller抛出来的异常。
当然,如果不想全局处理,只要处理某一个Controller,也可以这么做:
在该Controller下定义
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public RestResult handlerException(HttpServletRequest request,Exception e){
RestResult restResult = new RestResult();
restResult.setCode(200);
restResult.setData("hello");
restResult.setMsg("123");
return restResult;
}
@ExceptionHandler可以处理所在Controller任意方法抛出来的异常,包括其所在类的子类(可以继承)。
但是需要注意的时,某种情况下,并不好用,例如:
@RestController
public class FileUploadController{
SimpleDateFormat formatter = new SimpleDateFormat("/yyyy/MM/dd/");
@RequestMapping("/upload")
public String fileUpload(MultipartFile file, HttpServletRequest request){
String time = formatter.format(new Date());
//图片上传服务器后所在的文件夹
String realPath = request.getServletContext().getRealPath("/img") + time;
File folder = new File(realPath);
if(!folder.exists())
folder.mkdirs();
//通常需要修改图片的名字(防止重复)
String oldName = file.getOriginalFilename();
String newName = UUID.randomUUID() + oldName.substring(oldName.lastIndexOf("."));
try {
//将文件放到目标文件夹
file.transferTo(new File(folder, newName));
//通常还需要返回图片的URL,为了通用性,需要动态获取协议,不要固定写死
String returnUrl = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + "/img" + time + newName;
return returnUrl;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@ExceptionHandler(Exception.class)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public RestResult handlerException(HttpServletRequest request,Exception e){
RestResult restResult = new RestResult();
restResult.setCode(200);
restResult.setData("hello");
restResult.setMsg("123");
return restResult;
}
}
如果没有配置文件上传大小,传大文件的时候会出错。这个时候抛出来的异常就不能被@ExceptionHandler处理,因为这个异常不是Controller抛出来的。追踪异常栈:
发现是从Spring对于文件操作请求的解析类抛出来的异常(最底层还是过滤器),这种异常就不会被处理。
所以如果要实现全局异常处理的功能,最好还是配合@ControllerAdvice注解来使用。
2、@ModelAttribute
主要作用是向Model里面添加数据,以便在视图显示。用法比较多,结合不同的注解使用的时候,会有不同的含义。但是因为现在大多数都是前后端分离的项目,个人来说,还没怎么遇到过,就不做过多研究,留下一个链接供日后参考:
https://blog.csdn.net/leo3070/article/details/81046383
以上是关于06SpringBoot中 @ControllerAdvice注解(全局异常处理)与@ModelAttribute的使用的主要内容,如果未能解决你的问题,请参考以下文章
SpringBoot篇 - Controller中常用的注解简介