@ControllerAdvice 相当于 @Controller 的增强版,@Controller Advice 通常是用来处理全局数据的
在使用的时候一般是结合 @ExceptionHandler 、@ModelAttribute 、 @InitBinder 使用
@ControolerAdvice 跟 @ExceptionHandler 结合使用
@ExceptionHandler 是用来处理全局的异常,当发生指定的异常的时候,如果跟@ExceptionHandler中定义的异常一致们就会指定该方法中的内容,可以返回json 也可以返回ModeAndView 视图
@ControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(Exception.class)
表示 当 出现Exception 异常的时候,就会执行对应的方法 (使用json )
@ExceptionHandler(Exception.class)
public void uploadExcption(Exception e, HttpServletResponse response) throws IOException {
response.setContentType(e.toString());
PrintWriter writer = response.getWriter();
writer.write("发生异常");
writer.flush();
writer.close();
}
执行 ModelandView 视图
@ExceptionHandler(Exception.class)
public ModelAndView uploadExceptionModeAndView(Exception e, HttpServletResponse response) {
ModelAndView view = new ModelAndView();
view.setViewName("error");
view.addObject("msg", "发僧错误:" + e.toString());
return view;
}
在使用的时候,可以创建跟返回名称一致的视图,
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymelefaf.org">
<head>
<meta charset="UTF-8">
<title>错误视图</title>
</head>
<body>
<div th:text="${msg}"></div>
</body>
</html>
@ControllerAdvice 跟 @ModelAttribute 的使用
@ModelAttribute 用于在所有的请求之前执行,在当前类所有的请求之前执行
/**
* 会在下面所有请求方式方法执行前执行
* 返回时的key--value 的形式 其中 key 表示的name 的值 value 是返回的数据
*
* @return
*/
@ModelAttribute(name = "info")
public Map<String, Object> modelAttributeInfo() {
Map<String, Object> map = new HashMap<>();
map.put("name", "miao");
map.put("sex", "nv");
return map;
}
在获取的时候,需要使用到 model 进行数据的获取
/**
* @param model 用于获取 被 @ModelAttribute 所修饰的方法
*/
@RequestMapping("/hello")
@ResponseBody
public void hello(Model model) {
Map<String, Object> stringObjectMap = model.asMap();
Iterator<String> iterator = stringObjectMap.keySet().iterator();
while (iterator.hasNext()) {
// 获取的是 key 的值
String next = iterator.next();
Object value = stringObjectMap.get(next);
System.out.println(value);
}
}
@ControllerAdvice 跟 @InitBander
@InitBander 表示的是 请求参数处理,即将表单中的数据绑定到实体类上时进行一些额外的处理
其中用到的一个类: WebDataBinder 该类用于操作 从Web请求参数到JavaBean对象的数据绑定 专为Web环境而设计,但不依赖于Servlet API;
@InitBinder("a")
public void init(WebDataBinder webDataBinder) {
webDataBinder.setFieldDefaultPrefix("a.");
webDataBinder.setBindEmptyMultipartFiles(true);
webDataBinder.setFieldMarkerPrefix("");
}
@InitBinder("b")
public void init2(WebDataBinder webDataBinder) {
webDataBinder.setFieldDefaultPrefix("b.");
}
名称为 a 、b 可以引用使用
/**
* 结合 InitBinder 和 ModelAttribute 使用
* @param book
* @param author
* @return
*/
@GetMapping("/book")
@ResponseBody
public String book(@ModelAttribute("b") Book book,
@ModelAttribute("a") Author author) {
return "";
}
在传递参数的时候,使用的是 a. 则表示 将数据 放到 @ModelAttribute("a") 引用的 实体类中
例如:
http://localhost:8080/book?b.name= "123"&b.sex="nv"&a.name="12321"
会将不同的数据放到对应的实体中
其中用到的WebDataBinder 类中 包含三个set 方法,
void | setBindEmptyMultipartFiles(boolean bindEmptyMultipartFiles) 设置是否绑定空的MultipartFile参数。 |
void | setFieldDefaultPrefix(java.lang.String fieldDefaultPrefix) 指定可用于指示默认值字段的参数的前缀,其名称为“prefix + field”。 |
void | setFieldMarkerPrefix(java.lang.String fieldMarkerPrefix) 指定一个前缀,该前缀可用于标记可能为空的字段的参数,并将“prefix + field”作为名称 |