第一种使用用法,全局变量。
@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