programing

@RestControllerAdvision 대 @ControllerAdvision

testmans 2023. 7. 29. 08:16
반응형

@RestControllerAdvision 대 @ControllerAdvision

  • @RestControllerAdvise와 @ControllerAdvise의 주요 차이점은 무엇입니까?
  • 휴게 서비스 및 @ControllerAdvise MVC에 대해 항상 @RestControllerAdvise를 사용해야 합니까?

@RestControllerAdvice에 대한 통사적인 설탕일 뿐입니다.@ControllerAdvice+@ResponseBody여기 보시면 됩니다.

휴게 서비스 및 @ControllerAdvise MVC에 대해 항상 @RestControllerAdvise를 사용해야 합니까?

다시, 위에서 언급한 바와 같이,@ControllerAdviceREST 웹 서비스에도 사용할 수 있지만 추가로 사용해야 합니다.@ResponseBody.

또한 다음과 같이 이해할 수 있습니다.

@RestControler=@Controller+@ResponseBody

@RestControllerAdvice=@ControllerAdvice+@ResponseBody.

참고로@RestControllerAdviceRestfulApi가 포함된 예외를 처리하는 데 더 편리한 주석입니다.

운영 체제 사용 예:

@RestControllerAdvice
public class WebRestControllerAdvice {
  
  @ExceptionHandler(CustomNotFoundException.class)
  public ResponseMsg handleNotFoundException(CustomNotFoundException ex) {
    ResponseMsg responseMsg = new ResponseMsg(ex.getMessage());
    return responseMsg;
  }
}

이 경우 CustomNotFoundException의 예외 인스턴스가 응답 본문에 느려집니다.

여기서 추출된 예: https://grokonez.com/spring-framework/spring-mvc/use-restcontrolleradvice-new-features-spring-framework-4-3

예외:좋은 REST API는 예외를 적절하게 처리하고 사용자에게 적절한 응답을 보내야 합니다.처리되지 않은 예외로 사용자를 렌더링해서는 안 됩니다.REST API 개발자에게는 오류 처리와 관련된 두 가지 요구 사항이 있습니다.

  1. 오류 처리를 위한 공통 위치
  2. API 간에 올바른 HTTP 상태 코드를 가진 유사한 오류 응답 본문

@RestControllerAdvices는 @ControllerAdvices와 @ResponseBody의 조합입니다.

@ControllerAdvices 주석은 3.2년 봄에 처음 도입되었습니다.

RESTful Services의 예외를 처리하는 데 @ControllerAdvices 주석을 사용할 수 있지만 @ResponseBody를 별도로 추가해야 합니다.

참고:
GlobalExceptionHandler는 @ControllerAdvise로 주석을 달았습니다. 따라서 응용 프로그램 전체에서 컨트롤러의 예외를 가로채게 됩니다.

@RestControllerAdvise와 @ControllerAdvise의 차이점은 다음과 같습니다.

@RestControllerAdvice=@ControllerAdvice+@ResponseBody- REST서비스에서 사용할 수 있습니다.

@ControllerAdviceMVC와 Rest 웹 서비스 모두에서 사용할 수 있습니다. Rest 웹 서비스에서 사용할 경우 Response Body를 제공해야 합니다.

예:

예외 클래스:

@ResponseStatus(value = HttpStatus.NOT_FOUND)
public class ResourceNotFoundException extends Exception{

    private static final long serialVersionUID = 1L;
    public ResourceNotFoundException(String message){
        super(message);
    }
}

Rest Web Service에서 위 예외의 사용.

 @RestControllerAdvice
 public class MyRestControllerAdviceHandler {
     
 @ExceptionHandler(ResourceNotFoundException.class)
      public ResponseMsg resourceNotFoundException(ResourceNotFoundException ex) {
        ResponseMsg resMsg = new ResponseMsg(ex.getMessage());
        return resMsg;
      }
    
}

MVC에서 상기 예외의 사용.

@ControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    @ExceptionHandler(ResourceNotFoundException.class)
    public ResponseEntity<?> resourceNotFoundException(ResourceNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

@ControllerAdvise를 사용하고 메서드에서 오류 개체를 반환하는 경우 오류 개체의 이름을 가진 보기를 검색하여 예상된 응답을 반환하는 대신 해당 이름을 가진 보기 페이지를 생성하지 않은 경우 404를 반환합니다.

@ControllerAdvice
public class CustomizedExceptionHandler {
@ExceptionHandler({ UserNotFoundException.class })
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
public ExceptionResponce handleUserNotException(Exception ex, WebRequest request) throws Exception {
    ExceptionResponce exceptionResponce = new ExceptionResponce(new Date(), ex.getMessage(),
            request.getDescription(false));
    return exceptionResponce;


}

}

위 코드와 같이 400(BAD_REQUEST)을 반품하고 싶은데 400이 아닌 404(NOT_FAUND)를 반품하고 있습니다.

enter image description here

다음 방법 중 하나를 사용하여 이 문제를 해결할 수 있습니다.

  1. 메서드 또는 클래스에 @ResponseBody를 추가합니다.
  2. @RestControllerAdvise를 사용합니다.
  3. 또는 ResponseEntity에서 오류 개체를 래핑할 수 있습니다.

위의 방법 중 하나를 사용하면 올바른 응답이 반환됩니다.

언급URL : https://stackoverflow.com/questions/43124391/restcontrolleradvice-vs-controlleradvice

반응형