@ControllerAdvice可以实现
- 全局异常处理
- 全局数据绑定
- 全局数据预处理
代码如下
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class MyGlobalExceptionHandler {
//指明异常的处理类型,即如果这里指定为 NullpointerException,则数组越界异常就不会进到这个方法中来
@ExceptionHandler(Exception.class)
public ModelAndView customException(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("message",e.getMessage());
mv.setViewName("myerror");
return mv;
}
}
其中@ExceptionHandler注解是用来指明异常的处理类型的。
全局数据绑定一般用来做一些初始化的数据操作,将一些公共的数据定义在这个注解的类中,使得每个controller接口都可以访问这些数据。
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class MyGlobalExceptionHandler {
@ModelAttribute(name = "md")
public Map mydata(){
HashMap map = new HashMap<>();
map.put("age",99);
map.put("gender","男");
return map;
}
}
@ModelAttribute这个注解的意思是,标记这个方法的返回数据是一个全局数据,接下来就可以在任何一个controller接口获取到这里的数据了。下面写一个测试的controller实验一下,顺便给他一个异常情况。
package com.tobest.thymeleaf.controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(Model model){
Map map = model.asMap();
System.out.println(map);
int i = 1/0;
return "hello";
}
}
控制台输出了我们的map,并且在下面报了异常,除以0



