복붙노트

[SPRING] 스프링 3을 사용하여 프로그래밍 방식으로 HTTP 응답 상태 변경

SPRING

스프링 3을 사용하여 프로그래밍 방식으로 HTTP 응답 상태 변경

나는 아래 컨트롤러를 가지고있다.

@Controller("myController")
@RequestMapping("api")
public class MyController {

     @RequestMapping(method = RequestMethod.GET, value = "/get/info/{id}", headers = "Accept=application/json")
    public @ResponseBody
    Student getInfo(@PathVariable String info) {
.................
}




    @ExceptionHandler(Throwable.class)
    @ResponseStatus( HttpStatus.EXPECTATION_FAILED)
    @ResponseBody
    public String handleIOException(Throwable ex) {
        ErrorResponse errorResponse = errorHandler.handelErrorResponse(ex);
        return errorResponse.toString();
    }

}

컨트롤러에는 오류 처리 메커니즘이 있습니다. 오류 처리 옵션에서 항상 기대 상태 코드 417을 반환합니다. 그러나 오류 유형에 따라 500, 403 등의 동적 오류 HTTP 상태 코드를 설정해야합니다. 어떻게해야합니까?

해결법

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

    1.ResponseEntity 출력 유형의 유형을 변경해야합니다. 답변 : 문자열을 반환하는 Spring MVC @ResponseBody 메서드에서 HTTP 400 오류로 응답하는 방법?

    ResponseEntity 출력 유형의 유형을 변경해야합니다. 답변 : 문자열을 반환하는 Spring MVC @ResponseBody 메서드에서 HTTP 400 오류로 응답하는 방법?

  2. ==============================

    2.나는 해결책을 얻었고 이것을 공유하고 또한 좋은 제안을 알고 싶다.

    나는 해결책을 얻었고 이것을 공유하고 또한 좋은 제안을 알고 싶다.

    @Controller("myController")
    @RequestMapping("api")
    public class MyController {
    
        @RequestMapping(method = RequestMethod.GET, value = "/get/info/{id}", headers = "Accept=application/json")
        public @ResponseBody
        Student getInfo(@PathVariable String info) {
            // ...
        }
    
    }
    
    
    // ...    
        @ExceptionHandler(Throwable.class)
        //@ResponseStatus( HttpStatus.EXPECTATION_FAILED)<<remove this line
        @ResponseBody
        public String handleIOException(HttpServletResponse httpRes,Throwable ex){ // <<Change this 
            if (some condition) {
                httpRes.setStatus(HttpStatus.BAD_GATEWAY.value());
            } else {
                httpRes.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
            }                 
            ErrorResponse errorResponse = errorHandler.handleErrorResponse(ex);
            return errorResponse.toString();
        }
    

    휴식 클라이언트에서 예상 :

    502 Bad Gateway
    {
        "status":"BAD_GATEWAY",
        "error":"java.lang.UnsupportedOperationException",
        "message":"Some error message"
    }
    

    답장을 보내 주셔서 감사합니다. 좋은 관행을위한 조언이 필요합니다.

  3. ==============================

    3.위의 코드를 살펴보면, 던지고 처리중인 예외에 대해 더주의해야합니다. Throwable에 대한 예외 처리기를 설정하는 것은 지나치게 광범위하게 보입니다.

    위의 코드를 살펴보면, 던지고 처리중인 예외에 대해 더주의해야합니다. Throwable에 대한 예외 처리기를 설정하는 것은 지나치게 광범위하게 보입니다.

    이 방법은 내 XML / JSON 마샬링 주석을 사용하여 ErrorMessage 클래스를 만드는 것입니다.

    @XmlRootElement(name = "error")
    public class ErrorMessage {
        private Throwable exception;
        private String message;
        public ErrorMessage() {
            this.message = "";
        }
        public ErrorMessage(String message) {
            this.message = message;
        }
        public ErrorMessage(Throwable exception) {
            this.exception = exception;
            this.message = exception.getLocalizedMessage();
        }
        @XmlTransient
        @JsonIgnore
        public Throwable getException() {
            return exception;
        }
        public void setException(Throwable exception) {
            this.exception = exception;
        }
        @XmlElement(name = "message")
        public String getMessage() {
            return message;
        }
        public void setMessage(String message) {
            this.message = message;
        }
    }
    

    그 자리에, 나는 내 자신의 응용 프로그램 예외를 만들고 다음과 같은 예외 처리기 메서드를 만드는 경향이 있습니다.

    @ExceptionHandler(ResourceNotFoundException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.NOT_FOUND)
    public ErrorMessage handleResourceNotFoundException(ResourceNotFoundException e, HttpServletRequest req) {
        return new ErrorMessage(e);
    }
    
    @ExceptionHandler(InternalServerErrorException.class)
    @ResponseBody
    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorMessage handleInternalServerErrorException(InternalServerErrorException e, HttpServletRequest req) {
        return new ErrorMessage(e);
    }
    

    그러한 것들을 사용하면 컨트롤러 메소드에서 적절한 예외를 던질 필요가 있습니다. 예를 들어, ResourceNotFoundException을 던지면 Spring은이를 handleResourceNotFoundException 메소드로 리디렉션합니다.이 메소드는 404를 반환하고 JSON 또는 오류를 나타내는 XML도 반환합니다.

  4. ==============================

    4.API에 대해 Aspect를 사용할 수 있습니다. 서비스에 대해 @Around 인터셉터를 정의하면 응답 내용을 변경할 수 있습니다.

    API에 대해 Aspect를 사용할 수 있습니다. 서비스에 대해 @Around 인터셉터를 정의하면 응답 내용을 변경할 수 있습니다.

  5. from https://stackoverflow.com/questions/20067057/programmatically-change-http-response-status-using-spring-3-restful by cc-by-sa and MIT license