@ControllerAdvice注解的三种用法

@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的方法 他可以干很多事情

在这里插入图片描述

都是可以的

那么这就说到这里了 我们梦凡 加油!

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值