Spring MVC异常处理

在一个系统开发中,总会出现异常,如果这个异常可以处理就会在处理逻辑加上对异常的处理,如果无法处理就可能需要跳转到我们写好的一个友善的错误页面。不管这样都是要进行响应的。

下面介绍在开发中出现异常的几种处理方式:

将异常映射为http状态码

spring中的一些异常会默认映射http状态码

在出现上面的异常时,spring会根据默认的映射规则响应。但如果出现的是我们自定义的异常,那spring是不知道该如果映射的,这时我们可以通过@ResponseStatus注解给我们自定义的异常添加映射规则。

@ResponseStatus(value=HttpStatus.NOT_FOUND,reason="SPittle Not Found")
public class SpittleNotFoundException extends RuntimeException{
}

在上面的例子中,SpittleNotFoundExcaption是我们自定义的异常,通过注解@ResponseStatus(value=HttpStatus.NOT_FOUND,reason="SPittle Not Found"),我们就将这个注解映射为404状态了,当在controller中出现这个异常,我们没有进行处理,就会对用户返回一个404的响应。

编写异常处理方法

1,在处理请求的方法中直接处理异常

@RequestMapping("/login")
    public String saveSpittle(SpittleForm form, Model model){
        try {
            spittleRepository.save(form);
        }catch (DuplicateSpittleException e){
            return "error/duplicate";
        }
    }

2,在上面的处理方法如果只是处理一次这个异常当然没问题,但是如果controller中多处都出现这个异常,那每次都编写一次处理逻辑就会很麻烦,所以spring提供了@ExceptionHandler这个注解,通过这个注解可以编写一次异常处理应用到同一个controller的所有同样的异常处理中。

@ExceptionHandler(DuplicateSpittleException.class)
public String handleDuplicateSpittle(){
	return "error/duplicate";
}

只要在controller中添加上面这个方法,就可以对controller中所有的DuplicateSpittleException异常进行处理。

3,在上面的方法中可以对某个contrller的某个异常进行处理,但是在开发中还会出现这样的情况,不同的controller中也可能出现一样的异常,所有spring还提供给控制器添加通知的注解@ControllerAdvice。

@ControllerAdvice
public class AppWideExceptionHandler{
	@ExceptionHandler(DuplicateSpittleException.class)
	public String duplicateSpittleHandler(){
	 	return "error/duplicate";
	}
}

在编写上面的类后,所有的controller出现的所有DuplicateSpittleException异常都会通过duplicateSpittleHandler方法进行响应。

posted on 2020-05-15 14:17  ggsdduzdl  阅读(135)  评论(0编辑  收藏  举报

导航