전체 코드
https://github.com/GHGHGHKO/goose-auth-api-server
@Operation(summary = "GooseAuth delete item uris", description = "id로 접속 정보의 uri들을 삭제한다.")
@DeleteMapping(value = "/items/{itemIdentity}")
public ResponseEntity<SingleResult<DeleteItemUrisResponseDto>> gooseAuthDeleteItemUris(
@Parameter(name = "X-AUTH-TOKEN", required = true, in = HEADER) String token,
@Parameter(name = "Accept-Language", in = HEADER) AcceptLanguageEnum language,
@PathVariable Long itemIdentity,
@RequestParam List<Long> uriIdentity) {
return ResponseEntity.ok()
.body(responseService.getSingleResult(
itemsService.gooseAuthDeleteItemUris(itemIdentity, uriIdentity)
));
}
위 코드를 예시로 한다.
@RequestParam(required = true) 일 때,
queryString에서 null인 경우 (ex, /items/13? )
400 Bad request와
MissingServletRequestParameterException 오류가 나오게 된다.
난 오류를 response body로 이쁘게 보여주고 싶다.
Exception을 한 번에 Handling할 수 있는
ExceptionAdvice 클래스에서 작업했다.
@NotNull
@Override
protected ResponseEntity<Object> handleMissingServletRequestParameter(
MissingServletRequestParameterException missingServletRequestParameterException,
@NotNull HttpHeaders headers,
@NotNull HttpStatus status, @NotNull WebRequest request) {
ParameterError parameterError = new ParameterError();
parameterError.setParameterName(
missingServletRequestParameterException.getParameterName());
parameterError.setMessage(missingServletRequestParameterException.getMessage());
return ResponseEntity
.status(HttpStatus.BAD_REQUEST)
.body(responseService.getParameterFailResult(
Integer.parseInt(getMessage("parameterNotValid.code")),
getMessage("parameterNotValid.message"),
parameterError
));
}
해당 메서드를 Override한 이유는
ResponseEntityExceptionHandler.java에서 이미 선언되어있기 때문이다.
내가 원하는 response body로 만들어주기 위해 Override 했다.
MissingServletRequestParameterException 클래스 안에는
@Override
public String getMessage() {
return "Required request parameter '" + this.parameterName + "' for method parameter type " +
this.parameterType + " is " +
(isMissingAfterConversion() ? "present but converted to null" : "not present");
}
/**
* Return the name of the offending parameter.
*/
public final String getParameterName() {
return this.parameterName;
}
위와 같은 메서드를 제공하고 있다.
객체를 생성하여 (ParameterError) setter로 message와 parameterName을 set했다.
결과
Postman으로 테스트했다.
오류 Exception
정상케이스
'SpringBoot' 카테고리의 다른 글
GraalVM 으로 SpringBoot 시작 시간 줄이기 (맛보기) (0) | 2024.03.27 |
---|---|
jib 배포, 코드 배포, 코드 컨테이너, 앱 컨테이너 만들기 (0) | 2022.07.15 |
String, StringBuilder, StringBuffer 사용법 및 차이 (0) | 2021.12.23 |
통신 중 실패했을 때 재시도하기 (@Retryable, @Recover) (0) | 2021.12.22 |
DB 통신 속도 증가 Cacheable CacheEvict redis 활용 (0) | 2021.12.21 |