SpringBoot

RequestParam(required = true) null exception 하는 법

pepega 2022. 10. 5. 22:44

전체 코드

https://github.com/GHGHGHKO/goose-auth-api-server

 

GitHub - GHGHGHKO/goose-auth-api-server

Contribute to GHGHGHKO/goose-auth-api-server development by creating an account on GitHub.

github.com

 

@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

 

정상케이스