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
'programing' 카테고리의 다른 글
키를 누를 때 입력 필드를 흐리게 표시 각도 입력 (0) | 2023.03.10 |
---|---|
IE에서 이미지에 맞게 크기를 조정하라는 앵귤러 머티리얼 디자인의 지침을 얻는 방법은 무엇입니까? (0) | 2023.03.10 |
이유: void가 mockito 사용에 적합하도록 유형 변수 T의 인스턴스가 존재하지 않습니다. (0) | 2023.03.10 |
이온 이력은 어떻게 동작하며 비루트 스택은 언제 작성됩니까? (0) | 2023.03.10 |
AngularJS에서 여러 특정 모델 특성에 의한 필터링(OR 관계) (0) | 2023.03.10 |