@ControllerAdvice注解的三种用法
1.处理全局异常
2.预设全局数据
3.请求参数预处理
处理全局异常
这里我就借用之前写的文件上传进行演示
springboot文件上传:点我查看
我们吧文件上传最大大小设置为1KB
那么我们再次上传文件就会抛出这个异常
MaxUploadSizeExceededException
我们创建一个calss
加上ControllerAdvice这个注解
我们先上代码
@ControllerAdvice
public class myFileException {
//文件大小超出异常处理
@ExceptionHandler(MaxUploadSizeExceededException.class)
public void fileMax(HttpServletResponse response) throws IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("文件大小超出限制");
writer.flush();
writer.close();
}
}
当出现MaxUploadSizeExceededException这个异常时,会走这个方法
我们就会吧文件大小超出限制返回给前面
当然我们也可以使用thymeleaf模板返回model
这个用法比较的简单
预设全局数据
首先我们创建一个类
代码如下 比较简单 就是返回一个map
@ControllerAdvice
public class GetData {
@ModelAttribute(value = "dataMap")
public Map<String,Object> getmap(){
Map<String, Object> map =new HashMap<>();
map.put("name","梦凡");
map.put("age",20);
return map;
}
}
我们在controller的用法
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(Model model){
Map<String, Object> map = model.asMap();
//获取map的视图
Set<String> strings = map.keySet();
for (String key : strings) {
System.out.println(key+":"+map.get(key));
}
return "hello";
}
}
也比较简单 我们需要通过model获取到数据
然后我们进行了输出
运行访问hello打印出
是可以获取到的 这个能讲的不多 用法大致如此 会用即可
请求参数预处理
请求参数预处理 大家可能所遇到业务场景很少 但是呢如果遇到了 我们也能解决他
我举一个小例子大家来感受下他的一个作用
首先创建两个实体类
public class Book {
private String name;
private Double price;
}
public class Author {
private String name;
private Integer age;
}
然后分别给他们getset toString方法 我就不写在这儿了 太长也没意义
然后我们写一个非常简单的contorller
@RestController
public class BookController {
@PostMapping("/book")
public void SetBook(Book book,Author author){
System.out.println(book);
System.out.println(author);
}
}
我们使用postman来操作
如果没有postman的可以看我这篇文章下载
postman下载:点我下载
控制台打印
因为有两个name而系统识别不出来 那么就合二为一了
我们可以通过ControllerAdvice来解决这个问题
首先我们给接收参数的两个实体类一个别名
@RestController
public class BookController {
@PostMapping("/book")
public void SetBook(@ModelAttribute("b") Book book,@ModelAttribute("a") Author author){
System.out.println(book);
System.out.println(author);
}
}
然后创建一个类
@ControllerAdvice
public class GetData {
@InitBinder("a")
public void initA(WebDataBinder binder){
binder.setFieldDefaultPrefix("a.");
}
@InitBinder("b")
public void initB(WebDataBinder binder){
binder.setFieldDefaultPrefix("b.");
}
}
最上面我们一定要加上ControllerAdvice注解
然后我们吧a.的参数给a b.的参数给b
我们再来请求一次
这次postman的参数也要随之改一下
那么我们看结果
这样就没问题了
这只是他的一个用法
我们可以看下binder.set的方法 他可以干很多事情
都是可以的
那么这就说到这里了 我们梦凡 加油!