Spring 이상 처리: @ ExceptionHandler 백 엔 드 가 전단 에 이상 을 던 지 는 방법 에 대해 자세히 설명 합 니 다.

이 글 은 작가 삼 왕 이 처음으로 쓴 것 이다.
스프링 부 트 를 기반 으로 한 자바 백 엔 드 개발 에 착수 해 어떻게 우아 하 게 전면 에 이상 을 던 져 야 할 지 고민 했다.다행히 스프링 이 이상 처리 수단 을 제공 한 것 으로 밝 혀 졌 다.
Spring 은 @ ExceptionHandler 를 통 해 시스템 이 실 행 될 때 던 지 는 이상 을 차단 합 니 다.그 효과 적 인 역할 도 메 인 은 자신 이 처 한 Controller 입 니 다. 즉, 이상 처리 방법 은 다른 Controller 류 에서 던 진 이상 을 차단 하고 처리 할 수 없습니다.하지만 클래스 에서 @ Controller Advice (컨트롤 러 강화) 를 사용 할 수 있 습 니 다. 이 주 해 는 성명 의 클래스 에서 @ ExceptionHandler, @ InitBinder, @ ModelAttribute 주 해 를 사용 하 는 방법 을 모든 @ RequestMapping 주 해 를 사용 할 수 있 습 니 다. 전역 이상 을 차단 하 는 @ ExceptionHandler 를 설명 합 니 다.이렇게 하면 코드 의 번 거 로 움 을 효과적으로 줄 일 수 있다.구체 적 으로 어떻게 사용 하 는 지 는 구체 적 인 업무 수요 에 따라 결정 해 야 한다.
아래 코드:
ErrorInfo. java (이 종 류 는 전단 의 실체 로 되 돌아 가 는 데 사 용 됩 니 다)
public class ErrorInfo {
    private boolean success;
    private String msg;
    private Object errors;

    public boolean isSuccess(){
        return this.success; 
    } 
    public String getMsg() { 
        return this.msg; 
    } 
    public Object getErrors() { 
        return this.errors; 
    }


    public void setSuccess(boolean success)
    {
      this.success = success; 
    } 
    
    public void setMsg(String msg) { 
        this.msg = msg; 
    } 
    
    public void setErrors(Object errors) { 
        this.errors = errors; 
    }
}

BizException. java (BizException 은 우리 가 정의 한 업무 이상 클래스 입 니 다)
public class BizException extends Exception{

    /** 
     * @fields serialVersionUID 
     */ 
    
    private static final long serialVersionUID = -2420754730135049197L;
    private Object data;
      
    public BizException() {
        super();
    }
    
    public BizException(String message) {
        super(message);
    }

    public Object getData() {
        return this.data;
    }
    public void setData(Object data) {
        this.data = data;
    }
}

GlobalException Handler. java (이 종 류 는 모든 Controller 에서 던 진 BizException 을 처리 하 는 데 사 용 됩 니 다)
@RestController
@ControllerAdvice
public class GlobalExceptionHandler {
    private final Logger logger = LoggerFactory.getLogger(getClass());
    @ExceptionHandler({BizException.class})
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public  ErrorInfo handleBizException(BizException e){
        this.logger.info("------------    BIZ    ------------");
        ErrorInfo r = new ErrorInfo();
        r.setSuccess(false);
        r.setMsg(e.getMessage());
        this.logger.info("ErrorInfo==" + ToStringBuilder.reflectionToString(r));
        this.logger.info("------------    BIZ    ------------");
        return r;
        
    }
}

여기 서, 우 리 는 단지 BizException 을 차단 했다 고 성명 할 뿐, Exception Handler 에서 여러 개의 Exception 을 차단 하 는 것 을 지지 합 니 다. 괄호 안에 새로운 성명 을 추가 하면 됩 니 다. @Response Status 는 프론트 에 되 돌아 오 는 Http 상태 코드 를 설정 하 는 데 사 용 됩 니 다. 개인 적 으로 BAD 로 설정 하 는 것 을 권장 합 니 다.REQUEST, 즉 400.
전체 차단 이상 이 필요 하지 않 을 때, 우 리 는 이렇게 쓸 수 있 습 니 다: Association Controller. 자바 (일반 Controller 류)
@RestController
public class AssociationController {
    
    private final Logger logger = LoggerFactory.getLogger(getClass());
    
    @Autowired
    IStudentService studentService;
    
    //     ...

    @RequestMapping(value = "/student/get" , method = RequestMethod.GET)
    public Student getStudent(@RequestParam(value="name",required=false)String name) throws BizException{
        Student student = null;
        if (name != null) {
            if (name.equals("Chaves")) {
                throw new BizException("Chaves is invalid!");
            }
            student = studentService.findByName(name);
        }
        return student;     
    }
    
    @ExceptionHandler({BizException.class})
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ResponseBody
    public  ErrorInfo handleBizException(BizException e){
        this.logger.info("------------   AssociationController  BIZ    ------------");
        ErrorInfo r = new ErrorInfo();
        r.setSuccess(false);
        r.setMsg(e.getMessage());
        this.logger.info("ErrorInfo==" + ToStringBuilder.reflectionToString(r));
        this.logger.info("------------   AssociationController  BIZ    ------------");
        return r;
    }
        
}

이때 이 Excetion Handler 는 현재 클래스 에서 발생 하 는 BizException 만 차단 할 수 있 습 니 다.
이상나의 문장 이 너 에 게 도움 이 되 기 를 바란다.나 는 글 속 의 모든 견해 가 100% 정확 하 다 고 보장 할 수 는 없 지만, 나 는 그것들 이 모두 나의 이해 와 깨 달 음 이 고, 복사 와 붙 여 넣 기 를 거절 하 는 것 이 라 고 보장 할 수 있다.어떤 의견, 견해 또는 의혹 이 있 으 면 댓 글 토론 을 환영 합 니 다.

좋은 웹페이지 즐겨찾기