全局捕获异常:整个web请求项目全局捕获异常。
应用场景:
全局捕获异常原理:使用aop技术,采用异常通知
@ExceptionHandler表示拦截异常
@ControllerAdvice是controller的一个辅助类,最常用的就是作为全局异常处理的切面
@ControllerAdvice是可以指定扫描范围
@ControllerAdvice约定了几种可行的返回值,如果直接返回model类的话需要使用@ResponseBody进行json转换
返回string,表示跳到某个view,返回modelandview,返回model+@ResponseBody
ErrorController.java
@RestController
public class ErrorController {
@RequestMapping("/getUser")
public String getUser(int i) {
int j=1/i;
return "success"+j;
}
}
全局捕获异常类:GlobalExceptionHandler.java:
@ControllerAdvice(basePackages="com.itmayiedu.controller")
public class GlobalExceptionHandler {
//@ResponseBody返回json格式
//modelAndView返回页面
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String,Object>errorResult(){
//实际开发中,会将错误记录在日志中
Map<String,Object> errorResultMap=new HashMap<String,Object>();
errorResultMap.put("errorCode", "500");
errorResultMap.put("errorMsg", "系统错误");
return errorResultMap;
}
}
@Async相当于这个方法重新开辟了单独的线程进行执行
要在程序入口即整个程序启动的类上加上启动这个注解的注解
@SpringBootApplication
@EnableAsync//开启异步调用
public class JspApp {
public static void main(String[] args) {
SpringApplication.run(JspApp.class, args);
}
}
Controller层:
@RestController
@Slf4j
public class MemberController {
@Autowired
private MemberService memberService;
@RequestMapping("/addMemberAndEmail")
public String addMemberAndEmail() throws InterruptedException {
System.out.println("1");
String result=memberService.addMemberAndEmail();
//Thread.sleep(500);
System.out.println("4");
return "result="+result;
}
}
@Service
public class MemberService {
//添加用户的时候,会发送邮件
@Async//相当于这个方法重新开辟了单独的线程进行执行
//思路:使用AOP技术在运行时创建一个单独的线程进行执行
public String addMemberAndEmail() throws InterruptedException {
System.out.println("2");
Thread.sleep(5000);
System.out.println("3");
return "itmayiedu";
}
根据注解Async原理即使用AOP技术在运行时重新开辟了一个单独的线程运行来实现一下,重写service层:
@Service
public class MemberService {
public String addMemberAndEmail() {
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("2");
try {
Thread.sleep(50000);
}catch(Exception e) {}
System.out.println("3");
}
}).start();
return "itmayiedu";
}