spring 处理异常

一、将异常映射为HTTP状态码

(本篇所用代码承接 构建 Spring web 应用程序中的)

首先自定义一个异常类 SpittleNotFoundException 

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/*
 * ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") 将该异常映射为 HTTP 404 ,切返回信息为 Spittle Not Found
 */
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found")
public class SpittleNotFoundException extends RuntimeException {

    
    private static final long serialVersionUID = 1L;

}

然后在应用中合适的时候抛出该异常

    //接受请求的输入
    @RequestMapping(method=RequestMethod.GET)
    public List<Spittle> spittles(@RequestParam(value="max", defaultValue="30") long max, @RequestParam(value="count", defaultValue="20") int count) {
        System.out.println("pppppp");
        //List<Spittle> list = repository.findSpittles(Long.MAX_VALUE, 20);
        List<Spittle> list = null;
        if (list == null || list.size() <= 0) {
            throw new SpittleNotFoundException();
        }
        return list;
    }

浏览器返回如图

二、异常的统一处理

如果在方法中频繁的抛出同一种异常,并对其进行处理的话很繁琐如

    try {
            //do something ......
        } catch (Exception e) {
            //do something ......
        }

这样会繁琐的处理同一种异常,这种情况我们可以添加一个新的方法,它会处理所有当前控制器中抛出的你所指定的异常

    @ExceptionHandler(SpittleNotFoundException.class)
    public String handkeSpittleNotFoundException() {
        return "home";
    }

加上@ExceptionHandler注解,该方法会处理当前控制器中所有的 SpittleNotFoundException 异常

但是如果多个控制器中都需要对同一种类型的异常做相同的处理呢?当然我们可以创建基类,实现这个异常处理方法,然后所有的控制器都从基类中派生。但是,有更简单的方法,此时可以用控制器添加通知。

三、为控制器添加通知

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.ModelAttribute;

/*
 * 控制器通知是任意带有 @ControllerAdvice 注解的类, 这个类会有一个或多个如下类型的方法
 * @ExceptionHandler
 * @InitBinder
 * @ModelAttribute
 */
@ControllerAdvice
public class AppWideExceptionHandler {

    @ExceptionHandler(SpittleNotFoundException.class)
    public String handkeSpittleNotFoundException() {
        return "home";
    }
}

这样,AppWideExceptionHandler 类就可以处理当前应用中所有控制器所抛出的 SpittleNotFoundException 异常

猜你喜欢

转载自www.cnblogs.com/codefeng/p/9061075.html