SpringBoot는 Spring 애플리케이션의 생성, 실행, 디버깅, 배포 등 일련의 문제를 단순화하기 위해 탄생한 제품으로, 자동 어셈블리 기능을 통해 외부 XML 구성에만 집중할 수 있습니다. 사양을 준수해야 관련 종속성을 도입하여 쉽게 WEB 프로젝트를 구축할 수 있습니다
실제 프로젝트 개발에서는 프로그램에서 여러 가지 비정상적인 상황이 자주 발생하며, 특히 서버 측 개발자로서 우리는 항상 제공하기 위한 인터페이스를 끊임없이 작성합니다. 프론트 엔드 호출의 경우에는 예외를 피할 수 없으며 잘못된 정보가 사용자에게 직접 노출되면 경험이 가능하며 해커에게는 자세한 예외 정보가 제공되는 경우가 많습니다. ...
try-catch 메소드를 사용하여 예외 정보를 수동으로 캡처한 다음 해당 결과 세트를 반환합니다. 이 메소드는 간접적이지만 비슷한 코드(예: 결과 객체로 캡슐화됨)를 본 적이 있을 것입니다. 오류 노출 문제도 마찬가지입니다. 코드의 양이 늘어나면 해당 예외 항목과 오류 코드 간의 관계를 관리하기가 점점 더 어려워집니다. .매칭이므로 간단한 구성을 통해 전역 제어를 수행하는 것이 가장 좋습니다...
다음으로 Spring Boot에서 제공하는 솔루션을 살펴보겠습니다.
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; } }
예외 정보 스타일이 더욱 통일되도록 반환된 예외 정보의 형식을 정의합니다.
package com.battcn.exception; /** * @author Levin * @since public class ErrorResponseEntity private int code; private String message; // 省略 get set
코드에는 차이가 없는지 자세히 살펴보세요. 걱정하지 말고 계속 읽어보세요...
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:"
주석 개요:
@ 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); } }
준비 완료 마지막으로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!