@ControllerAdvice注解怎么用?

第一种使用用法,全局变量。

@ControllerAdvice
public class UserAspect {
    @ModelAttribute()
    public HashMap<String, Object> mydata(){
        HashMap<String, Object> map2 = new HashMap<>();
        map2.put("age", 99);
        map2.put("gender", "男");
        return map2;
    }
    @ModelAttribute(name = "data")
    public Map<String, Object> mydata2(){
        HashMap<String, Object> map2 = new HashMap<>();
        map2.put("age", 98);
        map2.put("gender", "女");
        return map2;
    }
}
//
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model){
        Map<String, Object> map = model.asMap();
        System.out.println(map);
        return "jello";
    }
}
///输出结果
//{data={gender=女, age=98}, hashMap={gender=男, age=99}}

配合@ModelAttribute()注解可以做全局变量使用,注意需要使用name属性作为数据的key,如果没有定义name,默认是使用返回结果类型的名称作为key,很容易被覆盖哦。








第二种用法:全局异常处理

@ControllerAdvice
public class ExceptionAspect {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Map handleException(Exception e) {
        Map<String, String> res = new HashMap<>();
        res.put("message", "程序发生了异常");
        return res;
    }
}
controller
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(Model model){
        int i = 1 / 0;
        return "jello";
    }
}

运行结果
在这里插入图片描述
注意添加@ResponseBody,可以在程序抛出异常的时候将信息以json的方法返回信息。








第三种用法:自定义参数绑定
当一个借口同时需要传递两个对象属性,但是恰好属性的名字存在相同的。

@Data
public class SignFlow {
    private Long id;

    private Integer codeValue;

}
@Data
public class OpenFlow {
    private Long id;

    private Integer codeValue;

}
//
@PostMapping("/sign")
    public String sign(SignFlow signFlow, OpenFlow openFlow){
        System.out.println(signFlow);
        System.out.println(openFlow);
        return "jello";
    }

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200929165440149.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkzNTcyMA==,size_16,color_FFFFFF,t_70#pic_center控制台打印情况
SignFlow(id=2, codeValue=1001)
OpenFlow(id=2, codeValue=1001)
两者都绑定上了。
在这里插入图片描述

@ControllerAdvice
public class BindParam {
    @InitBinder("signFlow")
    public void signFlow(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("signFlow.");
    }
    @InitBinder("openFlow")
    public void openFlow(WebDataBinder binder) {
        binder.setFieldDefaultPrefix("openFlow.");
    }
}

 @PostMapping("/sign")
    public String sign(@ModelAttribute("signFlow") SignFlow signFlow, @ModelAttribute("openFlow") OpenFlow openFlow){
        System.out.println(signFlow);
        System.out.println(openFlow);
        return "jello";
    }

在这里插入图片描述
再次查看打印记录
SignFlow(id=2, codeValue=1001)
OpenFlow(id=null, codeValue=null)
这种写法不支持json

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值