간단한 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과 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);
}
자세한 내용은이 훌륭한 블로그 게시물을 참조하십시오 : Spring MVC의 예외 처리
노트
Spring MVC에서는 @ResponseBody
어노테이션을 사용하는 것이 중복 @RestController
됩니다. 이미 어노테이션에 포함되어 있습니다.
답변
이를 수행하는 방법 중 하나는 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);
}
답변
이 코드를 시도하십시오.
@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));
}
답변
좋은 방법은 Spring의 ResponseStatusException 을 사용하는 것입니다.
a ResponseEntity
또는 이와 유사한 것을 반환하는 대신 ResponseStatusException
컨트롤러에서 HttpStatus
및 원인을 사용하여 간단히 던집니다. 예를 들면 다음과 같습니다.
throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "Cause description here");
또는:
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "Cause description here");
그러면 다음과 같은 본문과 함께 HTTP 상태 (예 : 400 잘못된 요청)가 포함 된 클라이언트에 대한 응답이 발생합니다.
{
"timestamp": "2020-07-09T04:43:04.695+0000",
"status": 400,
"error": "Bad Request",
"message": "Cause description here",
"path": "/test-api/v1/search"
}
답변
사용자 정의 상태 코드를 반환하려면 다음과 같이 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 상태 코드 내부 또는 외부의 정수일 수 있습니다.
답변
상태 코드를 반환하는 방법에는 여러 가지가 있습니다. 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;
}
답변
