복붙노트

[SPRING] 스프링 부트 - 오류 처리

SPRING

스프링 부트 - 오류 처리

난 가능한 오류 (봄, SQL 등) 잡을 내 컨트롤러에 대한 봄 - 부팅 오류 처리기를 작성하려고합니다. 지금까지 Null과 함께 JSON 응답을 얻을 수 있지만 내부에 데이터를 넣을 수는 없습니다. 오류 메시지가 나타나면 빈 페이지가 나타납니다.

import java.io.IOException;
import java.sql.SQLException;

import javax.servlet.http.HttpServletRequest;

import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.multiaction.NoSuchRequestHandlingMethodException;

@RestController
public class BasicErrorController implements ErrorController {
    private static final String ERROR_PATH = "/error";

    @RequestMapping(value=ERROR_PATH)
    @ExceptionHandler(value = {NoSuchRequestHandlingMethodException.class, SQLException.class, IOException.class, RuntimeException.class, Exception.class})
    public ErrorBody defaultErrorHandler(HttpServletRequest request, Exception e) {     
        ErrorBody eBody = new ErrorBody();         
        eBody.setMessage(e.getCause().getMessage());
        return eBody;
    }
}
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class ErrorBody {
    private String dateTime;
    private String exception;
    private String url;
    private String message;
}

해결법

  1. ==============================

    1.다음과 같이 할 수 있습니다.

    다음과 같이 할 수 있습니다.

     @ControllerAdvice
       public class ControllerExceptionTranslator {
    
    
        @ExceptionHandler(EntityNotFoundException.class)
        @ResponseStatus(HttpStatus.NOT_FOUND)
        @ResponseBody
        SimpleErrorMessage handleException(EntityNotFoundException exception){
            log.debug("Entity Not Found Exception {}",exception.getMessage());
            log.trace(exception.getMessage(),exception);
            return new SimpleErrorMessage("Entity not found","This resource was not found");
        }
    
    
        @ExceptionHandler({UsernameNotFoundException.class})
        @ResponseStatus(HttpStatus.UNAUTHORIZED)
        @ResponseBody
        SimpleErrorMessage handleException(UsernameNotFoundException exception){
            log.debug("Username not found {}",exception.getLocalizedMessage());
            log.trace(exception.getMessage(),exception);
            return new SimpleErrorMessage("Unaouthorized"," ");
        }
    
    
    }
    
  2. ==============================

    2.오류에 대한 데이터를 얻고 "HttpServletRequest 요청"을 사용하고 요청에서 정보를 읽음으로써 json으로 적절하게 보낼 수있었습니다.

    오류에 대한 데이터를 얻고 "HttpServletRequest 요청"을 사용하고 요청에서 정보를 읽음으로써 json으로 적절하게 보낼 수있었습니다.

    @RequestMapping(value = ERROR_PATH)
        public ErrorBody defaultErrorHandler(HttpServletRequest request) {....}
    
  3. ==============================

    3.여기는 @ExceptionHandler (Exception.class)의 예입니다.

    여기는 @ExceptionHandler (Exception.class)의 예입니다.

    https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

    @ControllerAdvice를 사용할 수 있습니다.

    package demo.controller;
    
    import org.springframework.web.bind.WebDataBinder;
    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
    public class ExceptionControllerAdvice {
    
     @InitBinder
     public void initBinder(WebDataBinder binder) {
        System.out.println("controller advice: init binder");
    }
    
    
    @ExceptionHandler(Exception.class)
    public String exception(Exception e) {
        System.out.println("controller advice: exception Handler");
        System.out.println(e.getMessage());
        return "error";
    }
    
    @ModelAttribute
    public void modelAttribute(){
        System.out.println("controller advice:model Attribute");
    }
    }
    
  4. from https://stackoverflow.com/questions/28501154/spring-boot-error-handling by cc-by-sa and MIT license