>  기사  >  Java  >  SpringBoot 전역 예외 문제를 해결하는 방법

SpringBoot 전역 예외 문제를 해결하는 방법

王林
王林앞으로
2023-05-16 10:49:121548검색

SpringBoot는 Spring 애플리케이션의 생성, 실행, 디버깅, 배포 등 일련의 문제를 단순화하기 위해 탄생한 제품으로, 자동 어셈블리 기능을 통해 외부 XML 구성에만 집중할 수 있습니다. 사양을 준수해야 관련 종속성을 도입하여 쉽게 WEB 프로젝트를 구축할 수 있습니다

실제 프로젝트 개발에서는 프로그램에서 여러 가지 비정상적인 상황이 자주 발생하며, 특히 서버 측 개발자로서 우리는 항상 제공하기 위한 인터페이스를 끊임없이 작성합니다. 프론트 엔드 호출의 경우에는 예외를 피할 수 없으며 잘못된 정보가 사용자에게 직접 노출되면 경험이 가능하며 해커에게는 자세한 예외 정보가 제공되는 경우가 많습니다. ...

try-catch 메소드를 사용하여 예외 정보를 수동으로 캡처한 다음 해당 결과 세트를 반환합니다. 이 메소드는 간접적이지만 비슷한 코드(예: 결과 객체로 캡슐화됨)를 본 적이 있을 것입니다. 오류 노출 문제도 마찬가지입니다. 코드의 양이 늘어나면 해당 예외 항목과 오류 코드 간의 관계를 관리하기가 점점 더 어려워집니다. .매칭이므로 간단한 구성을 통해 전역 제어를 수행하는 것이 가장 좋습니다...

다음으로 Spring Boot에서 제공하는 솔루션을 살펴보겠습니다.

1 종속성 가져오기

pom에 spring-boot-starter-web 추가 .xml

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

Customized 예외
에 의존하세요. 애플리케이션 개발 과정에서 시스템 자체의 예외 외에도 다양한 비즈니스 시나리오에서 사용되는 예외도 쉽게 가져오기라는 제목과 더 관련이 있습니다. 전역 예외, 자신만의 예외 정의, 캡처 방법 보기...

package com.battcn.exception;

/**
 * 自定义异常
 *
 * @author Levin
 * @since
public class CustomException extends RuntimeException

    private static final long serialVersionUID = 4564124491192825748L;

    private int code;

    public CustomException() {
        super();
    }

    public CustomException(int code, String message) {
        super(message);
        this.setCode(code);
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }
}

2 예외 정보 템플릿

예외 정보 스타일이 더욱 통일되도록 반환된 예외 정보의 형식을 정의합니다.

package com.battcn.exception;

/**
 * @author Levin
 * @since
public class ErrorResponseEntity

    private int code;
    private String message;
    // 省略 get set

3 제어 레이어

코드에는 차이가 없는지 자세히 살펴보세요. 걱정하지 말고 계속 읽어보세요...

package com.battcn.controller;

import com.battcn.exception.CustomException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * 全局异常演示
 *
 * @author Levin
 * @since
@RestController
public class ExceptionController

    @GetMapping("/test3")
    public String test3(Integer num) {
        // TODO 演示需要,实际上参数是否为空通过 @RequestParam(required = true)  就可以控制
        if (num == null) {
            throw new CustomException(400, "num不能为空");
        }
        int i = 10 / num;
        return "result:"

4 예외 처리(키)

주석 개요:

  • @ ControllerAdviceController 레이어에서 발생하는 예외를 잡아보세요. @ResponseBody를 추가하면 반환 정보는 JSON 형식이 됩니다.

  • @RestControllerAdvice은 @ControllerAdvice와 @ResponseBody의 조합과 동일합니다.

  • @ExceptionHandler 한 가지 유형의 예외를 통합 처리하여 코드 중복률과 복잡성을 줄입니다.

GlobalExceptionHandler 클래스를 생성하고 @RestControllerAdvice 주석을 추가하여 예외 알림 클래스를 정의한 다음 정의된 메서드에 @ExceptionHandler를 추가하여 예외를 캡처합니다...

package com.battcn.config;

import com.battcn.exception.CustomException;
import com.battcn.exception.ErrorResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 全局异常处理
 *
 * @author Levin
 * @since
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler


    /**
     * 定义要捕获的异常 可以多个 @ExceptionHandler({})
     *
     * @param request  request
     * @param e        exception
     * @param response response
     * @return
    @ExceptionHandler(CustomException.class)
    public ErrorResponseEntity customExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        CustomException exception = (CustomException) e;
        return new ErrorResponseEntity(exception.getCode(), exception.getMessage());
    }

    /**
     * 捕获  RuntimeException 异常
     * TODO  如果你觉得在一个 exceptionHandler 通过  if (e instanceof xxxException) 太麻烦
     * TODO  那么你还可以自己写多个不同的 exceptionHandler 处理不同异常
     *
     * @param request  request
     * @param e        exception
     * @param response response
     * @return
    @ExceptionHandler(RuntimeException.class)
    public ErrorResponseEntity runtimeExceptionHandler(HttpServletRequest request, final Exception e, HttpServletResponse response) {
        response.setStatus(HttpStatus.BAD_REQUEST.value());
        RuntimeException exception = (RuntimeException) e;
        return new ErrorResponseEntity(400, exception.getMessage());
    }

    /**
     * 通用的接口映射异常处理方
     */
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers,
                                                             HttpStatus status, WebRequest request) {
        if (ex instanceof MethodArgumentNotValidException) {
            MethodArgumentNotValidException exception = (MethodArgumentNotValidException) ex;
            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()), status);
        }
        if (ex instanceof MethodArgumentTypeMismatchException) {
            MethodArgumentTypeMismatchException exception = (MethodArgumentTypeMismatchException) ex;
            logger.error("参数转换失败,方法:" + exception.getParameter().getMethod().getName() + ",参数:" + exception.getName()
                    + ",信息:" + exception.getLocalizedMessage());
            return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);
        }
        return new ResponseEntity<>(new ErrorResponseEntity(status.value(), "参数转换失败"), status);
    }
}

Test

준비 완료 마지막으로 Chapter17Application을 시작합니다. 다음 테스트 결과를 보면 정말 간편해진 것을 알 수 있습니다. 코드가 깔끔해지고 확장성이 좋아졌습니다...

http://localhost:8080/test3

{"code":400,"message":"num不能为空"}

http://localhost를 방문해 보세요. :8080/test3?num=0

{"code":400,"message":"/ by zero"}

http://localhost:8080/test3?num=5

result:2
방문

위 내용은 SpringBoot 전역 예외 문제를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제