programing

Spring Boot Rest Controller는 다른 HTTP 상태 코드를 반환하는 방법

oldcodes 2023. 3. 10. 22:44
반응형

Spring Boot Rest Controller는 다른 HTTP 상태 코드를 반환하는 방법

심플한 REST API에 Spring Boot을 사용하고 있으며, 장애가 발생했을 경우 올바른 HTTP 상태 코드를 반환하고 싶습니다.

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
@ResponseBody
@ResponseStatus( HttpStatus.OK )
public RestModel create(@RequestBody String data) {
    // code ommitted..
    // how do i return a correct status code if something fails?
}

Spring Boot 및 Spring Boot를 처음 사용하는 기본적인 질문은 정상 또는 장애가 발생했을 때 다른 상태 코드를 반환하는 방법입니다.

사용할 수 있는 옵션은 여러 가지가 있습니다.꽤 좋은 방법은 예외와 클래스를 사용하는 것입니다.@ControllerAdvice:

@ControllerAdvice
class GlobalControllerExceptionHandler {
    @ResponseStatus(HttpStatus.CONFLICT)  // 409
    @ExceptionHandler(DataIntegrityViolationException.class)
    public void handleConflict() {
        // Nothing to do
    }
}

또 합격할 수 있다.HttpServletResponse컨트롤러 메서드에 접속하여 응답 코드를 설정합니다.

public RestModel create(@RequestBody String data, HttpServletResponse response) {
    // response committed...
    response.setStatus(HttpServletResponse.SC_ACCEPTED);
}

상세한 것에 대하여는, 다음의 훌륭한 블로그 투고를 참조해 주세요.스프링 MVC에서의 예외 처리


메모

봄 MVC에서 사용@ResponseBody주석은 중복되어 있습니다. 주석에 이미 포함되어 있습니다.

이를 위한 방법 중 하나는ResponseEntity반환 오브젝트로 사용합니다.

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
public ResponseEntity<?> create(@RequestBody String data) {
    if(everything_fine) {
        return new ResponseEntity<>(RestModel, HttpStatus.OK);
    } else {
        return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

Spring의 ResponseStatusException을 사용하는 것이 좋습니다.

반환하지 않고ResponseEntity또는 비슷한 것을 단순히 던질 뿐이다.ResponseStatusException컨트롤러로부터HttpStatus예를 들어 다음과 같습니다.

throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Cause description here");

이것에 의해, 클라이언트에 대한 응답에 HTTP 상태가 포함됩니다.

{
  "timestamp": "2020-07-09T04:43:04.695+0000",
  "status": 400,
  "error": "Bad Request",
  "message": "Cause description here",
  "path": "/test-api/v1/search"
}

주의:HttpStatus는 사용자의 편의를 위해 다양한 상태 코드를 제공합니다.

커스텀 정의 상태 코드를 반환하는 경우 다음과 같이 ResponseEntity를 사용할 수 있습니다.

@RequestMapping(value="/rawdata/", method = RequestMethod.PUT)
public ResponseEntity<?> create(@RequestBody String data) {
    int customHttpStatusValue = 499;
    Foo foo = bar();
    return ResponseEntity.status(customHttpStatusValue).body(foo);
}

CustomHttpStatusValue는 표준 HTTP 상태 코드 내외의 정수입니다.

다음 코드를 사용해 보십시오.

@RequestMapping(value = "/validate", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<ErrorBean> validateUser(@QueryParam("jsonInput") final String jsonInput) {
    int numberHTTPDesired = 400;
    ErrorBean responseBean = new ErrorBean();
    responseBean.setError("ERROR");
    responseBean.setMensaje("Error in validation!");

    return new ResponseEntity<ErrorBean>(responseBean, HttpStatus.valueOf(numberHTTPDesired));
}

상태 코드를 반환하는 방법은 여러 가지가 있습니다.1 : RestController 클래스는 BaseRest 클래스를 확장해야 합니다.BaseRest 클래스에서는 예외를 처리하고 예상되는 에러 코드를 반환할 수 있습니다.예를 들어 다음과 같습니다.

@RestController
@RequestMapping
class RestController extends BaseRest{

}

@ControllerAdvice
public class BaseRest {
@ExceptionHandler({Exception.class,...})
    @ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)
    public ErrorModel genericError(HttpServletRequest request, 
            HttpServletResponse response, Exception exception) {
        
        ErrorModel error = new ErrorModel();
        resource.addError("error code", exception.getLocalizedMessage());
        return error;
    }

가장 쉬운 방법은 메서드의 반환 유형을 다음과 같이 만드는 것이라고 생각합니다.

ResponseEntity<WHATEVER YOU WANT TO RETURN>

상태 코드를 전송하려면 return 스테이트먼트를 다음과 같이 추가합니다.

return ResponseEntity.status(HTTP STATUS).build();

예를 들어, 책 목록을 반환하려면

public ResponseEntity<List<books>> getBooks(){

  List<books> list = this.bookService.getAllBooks();
  
  if(list.size() <= 0)
     return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
  else
     return ResponseEntity.of(Optional.of(list));

}

언급URL : https://stackoverflow.com/questions/24292373/spring-boot-rest-controller-how-to-return-different-http-status-codes

반응형