Пользовательская глобальная обработка исключений Springboot

Spring Boot
Пользовательская глобальная обработка исключений Springboot

Эта статья была впервые опубликована в блоге технологий Java[код]:jdkcb.com/

Предисловие:

В реальной разработке приложений некоторые программные ошибки часто вызваны некоторыми неконтролируемыми факторами.В это время информация об исключении должна быть возвращена клиенту вовремя, чтобы клиент мог своевременно с ней справиться, а для исключения вызванный кодом, у нас обычно есть два метода обработки, один - бросать напрямую бросками, другой - использовать try..catch для захвата, в общем, если логика ненормальна, нам нужно знать информацию об исключении, мы часто выбирают генерацию исключения, хотя бы для того, чтобы гарантировать, что программа может продолжать работать в случае ошибки, используйте try..catch для захвата.

Но try..catch приведет к увеличению объема кода, что сделает наш код раздутым и сложным для дальнейшего обслуживания. Конечно, как такой отличный фреймворк, Springboot точно не будет сидеть сложа руки.Благодаря аннотациям, которые идут вместе со Springboot, мы можем легко настроить наш глобальный обработчик исключений и вернуть его нашему клиенту в формате json.

Код боя:

Перехватить глобальное исключение:

Прежде всего, давайте возьмем на себя ответственность за новый класс catch для глобальной обработки исключений: MyControllerAdvice, код которого выглядит следующим образом:

@ControllerAdvice
public class MyControllerAdvice {


    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map<String,Object> exceptionHandler(Exception ex){
        Map<String,Object> map  = new HashMap<String,Object>();
        map.put("code",100);
        map.put("msg",ex.getMessage());
        //这里可以加上我们其他的异常处理代码,比如日志记录,,,
        return map;
    }

}

Примечания:

@ControllerAdvice фиксирует исключения, возникающие на уровне контроллера, через АОП с аннотацией @ExceptionHandler(). Если вам нужно сканировать контроллер по пользовательскому пути, добавьте свойство basePackages

@ControllerAdvice(basePackages ="com.example.demo.controller")

@RestControllerAdvice : то же, что и @ControllerAdvice, его можно понимать как комбинацию @ResponseBody+@ControllerAdvice.

@ExceptionHandler(): Основная функция этой аннотации состоит в том, чтобы объявить один или несколько типов исключений.Когда квалифицированный контроллер выдает эти исключения, эти исключения будут перехвачены, а затем обработаны в соответствии с логикой отмеченных ими методов, тем самым изменение Возвращаемая информация о представлении.

контрольная работа:

@RestController
public class UserController {


    @GetMapping("/test")
    public String test(){
        int num = 1/0;
        return "Hello World";
    }


}

результат:

{"msg":"/ by zero","code":100}

Поймать пользовательское исключение:

Настройте наш класс информации об исключении MyException и наследуйте RuntimeException:

public class MyException extends RuntimeException {

    private String errorCode;
    private String errorMsg;

    public MyException(String errorCode, String errorMsg) {
        this.errorCode = errorCode;
        this.errorMsg = errorMsg;
    }


    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorMsg() {
        return errorMsg;
    }

    public void setErrorMsg(String errorMsg) {
        this.errorMsg = errorMsg;
    }
    
}

Измените наш MyControllerAdvice, чтобы добавить MyException:

    @ResponseBody
    @ExceptionHandler(value = MyException.class)
    public Map<String,Object> myExceptionHandler(MyException mex){
        Map<String,Object> map  = new HashMap<String,Object>();
        map.put("code",mex.getErrorCode());
        map.put("msg",mex.getErrorMsg());
        //其他业务代码...
        return map;
    }

контрольная работа:

    @GetMapping("/test1")
    public String test1(){
        String name = null;
        if(name == null){
            throw new MyException("101","用户名为空");
        }
        return "Hello World";
    }

вывод:

{"msg":"用户名为空","code":"101"}

Готово~, следуй за мной, ешь привет фрукты, хм.