1. 개요

이 빠른 기사는 Spring MVC 컨트롤러에서 사용자 지정 HTTP 상태 코드반환 하는 몇 가지 방법을 보여줍니다 .

이는 클라이언트에 대한 요청의 결과를보다 명확하게 표현하고 HTTP 프로토콜의 풍부한 의미 체계를 사용하기 위해 종종 중요합니다. 예를 들어 요청에 문제가 발생한 경우 가능한 각 유형의 문제에 대해 특정 오류 코드를 보내면 클라이언트가 적절한 오류 메시지를 사용자에게 표시 할 수 있습니다.

기본 Spring MVC 프로젝트의 설정은이 기사의 범위를 벗어나지 만 여기에서 자세한 정보를 찾을 수 있습니다 .

2. 사용자 지정 상태 코드 반환

Spring은 Controller 클래스 에서 사용자 정의 상태 코드를 반환하는 몇 가지 기본 방법을 제공합니다 .

  • 사용 ResponseEntity을
  • 예외 클래스에 @ResponseStatus 어노테이션 사용
  • @ControllerAdvice@ExceptionHandler 어노테이션을 사용합니다 .

이러한 옵션은 상호 배타적이지 않습니다. 그것과는 거리가 먼 그들은 실제로 서로 보완 할 수 있습니다.

이 기사에서는 처음 두 가지 방법 ( ResponseEntity@ResponseStatus )에 대해 설명합니다. @ControllerAdvice@ExceptionHandler 사용에 대한 자세한 내용은 여기에서 읽을 수 있습니다 .

2.1. ResponseEntity 를 통해 상태 코드 반환

표준 Spring MVC 컨트롤러에서 간단한 매핑을 정의합니다.

@RequestMapping(value = "/controller", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaResponseEntity() {
    return new ResponseEntity(HttpStatus.NOT_ACCEPTABLE);
}

" / controller "에 대한 GET 요청을 수신하면 Spring은 406 코드 (허용되지 않음)로 응답을 리턴합니다. 이 예에서는 특정 응답 코드를 임의로 선택했습니다. 모든 HTTP 상태 코드를 반환 할 수 있습니다 (전체 List은 여기 에서 찾을 수 있음 ).

2.2. 예외를 통해 상태 코드 반환

Exception사용하여 상태 코드를 반환하는 방법을 보여주기 위해 컨트롤러에 두 번째 메서드를 추가합니다 .

@RequestMapping(value = "/exception", method = RequestMethod.GET)
@ResponseBody
public ResponseEntity sendViaException() {
    throw new ForbiddenException();
}

" / exception "에 대한 GET 요청을 받으면 Spring은 ForbiddenException 을 던질 것 입니다. 이것은 별도의 클래스에서 정의 할 사용자 지정 예외입니다.

@ResponseStatus(HttpStatus.FORBIDDEN)
public class ForbiddenException extends RuntimeException {}

이 예외에는 코드가 필요하지 않습니다. 모든 작업은 @ResponseStatus 어노테이션에 의해 수행됩니다 .

이 경우 예외가 발생하면 예외를 발생시킨 컨트롤러가 응답 코드 403 (금지됨)으로 응답을 반환합니다. 필요한 경우 응답과 함께 반환 될 어노테이션에 메시지를 추가 할 수도 있습니다.

이 경우 클래스는 다음과 같습니다.

@ResponseStatus(value = HttpStatus.FORBIDDEN, reason="To show an example of a custom message")
public class ForbiddenException extends RuntimeException {}

예외가 모든 상태 코드를 반환하도록하는 것은 기술적으로 가능하지만 대부분의 경우 오류 코드 (4XX 및 5XX)에 예외를 사용하는 것이 논리적으로 합리적이라는 점에 유의해야합니다.

3. 결론

예제은 Spring MVC 컨트롤러에서 커스텀 상태 코드를 반환하는 방법을 보여주었습니다.

구현은 예제 GitHub 프로젝트 에서 찾을 수 있습니다 .