SpringBoot全局捕获异常及Async注解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36594703/article/details/81291987

全局捕获异常:整个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";
	}

猜你喜欢

转载自blog.csdn.net/qq_36594703/article/details/81291987