복붙노트

[SPRING] Spring @ExceptionHandler에서 @ ResponseStatus-annotated 예외로 예외를 다시 발생시키는 방법?

SPRING

Spring @ExceptionHandler에서 @ ResponseStatus-annotated 예외로 예외를 다시 발생시키는 방법?

나는 404 페이지를 원할 때 항상 던지고있는 예외를 만들었습니다.

@ResponseStatus( value = HttpStatus.NOT_FOUND )
public class PageNotFoundException extends RuntimeException {

내 404 예외로 ArticleNotFoundException (오류 500 발생) 다시 던져 컨트롤러 범용 @ExceptionHandler 만들려는 :

@ExceptionHandler( value=ArticleNotFoundException.class )
public void handleArticleNotFound() {
    throw new PageNotFoundException();
}

하지만 작동하지 않습니다 - 난 아직도 오류 500 및 봄 로그 :

ExceptionHandlerExceptionResolver - @ExceptionHandler 메서드의 호출에 실패했습니다.

응답 코드는 ResponseEntity와 같이 비어 있거나 간단한 문자열 일 수 없으므로 코드를 html로 변환합니다. web.xml 항목 :

<error-page>
    <location>/resources/error-pages/404.html</location>
    <error-code>404</error-code>
</error-page>

답변에서 최종 해결 방법

그것은 완전히 다시 던지지만, 적어도 내 PageNotFoundException 같은 web.xml 오류 페이지 매핑을 사용하여

    @ExceptionHandler( value = ArticleNotFoundException.class )
    public void handle( HttpServletResponse response) throws IOException {
        response.sendError( HttpServletResponse.SC_NOT_FOUND );

    }

해결법

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

    1.예외를 throw하는 대신 다음을 시도하십시오.

    예외를 throw하는 대신 다음을 시도하십시오.

    @ExceptionHandler( value=ArticleNotFoundException.class )
    public ResponseEntity<String> handleArticleNotFound() {
        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
    }
    

    이것은 기본적으로 컨트롤러에 의해 404로 변환되는 Spring 객체를 반환합니다.

    프런트 엔드에 다른 HTTP 상태 메시지를 반환하려는 경우 다른 HttpStatus를 전달할 수 있습니다.

    주석을 사용하여이 작업을 수행하지 못한 경우 @ResponseStatus를 사용하여 컨트롤러 메서드에 주석을 달고 예외를 throw하지 마십시오.

    기본적으로 @ExceptionHandler를 사용하여 메소드에 주석을 추가하면 Spring이 해당 메소드가 예외를 소비하고 다른 메소드를 throw하지 않을 것이라고 90 % 확신합니다. 다른 예외를 throw함으로써 Spring은 예외가 처리되지 않았고 예외 처리기가 실패한 것으로 생각하므로 로그의 메시지

    편집하다:

    특정 페이지로 돌아가려면

    return new ResponseEntity<String>(location/of/your/page.html, HttpStatus.NOT_FOUND);
    

    편집 2 : 당신은 이것을 할 수 있어야합니다 :

    @ExceptionHandler( value=ArticleNotFoundException.class )
    public ResponseEntity<String> handleArticleNotFound(HttpServletResponse response) {
        response.sendRedirect(location/of/your/page);
        return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
    }
    
  2. from https://stackoverflow.com/questions/23077573/how-to-rethrow-exception-as-responsestatus-annotated-exception-in-spring-excep by cc-by-sa and MIT license