나는이 개 봄의 유효성 검사를 사용하려고 시도하는거야 @RequestParam
과 함께,의 @ControllerAdvice
매개 변수가없는 프레임 워크에 의해 던져진 예외를 잡기 및 누락 된 매개 변수와 함께 400 오류를 반환.
따라서 내 코드는 다음과 같습니다.
@RestController
@Validated
public class FooController {
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@ResponseBody
public Foo getFoo(@RequestParam LocalDate dateFrom, @RequestParam LocalDate dateTo) {
// Do stuff
}
}
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler(value = {MissingServletRequestParameterException.class})
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponse handleMissingParameterException(MissingServletRequestParameterException ex) {
return new ErrorResponse(ex.getMessage());
}
}
단일 매개 변수를 놓친 경우 완벽하게 작동합니다. 다음과 같은 멋진 JSON 응답을받습니다.
{
"reason": "Required LocalDate parameter 'dateFrom' is not present"
}
400 상태입니다.
그러나 두 매개 변수를 모두 놓치면 위와 동일한 오류 응답이 표시됩니다. 즉, 첫 번째 누락 된 매개 변수 만보고하므로 모든 매개 변수를 나열 할 수 있으면 선호합니다.
예외의 방법을 살펴보면 단일 매개 변수 만 처리하려는 것 같습니다. 단일 매개 변수 getParameterName()
와 메소드가 있습니다 getParameterType()
.
클라이언트의 경험을 향상시키기 위해 Spring에서 모든 유효성 검사 오류를 단일 예외로보고하도록 할 수있는 방법이 있습니까?
을 설정 @RequestParam(required = false)
하고 사용할 수 있습니다 @NotNull
.
매개 변수가 null
이면 a ConstraintViolationException
가 발생합니다. 이를 처리하려면 @ExceptionHandler
메서드를 선언하면 됩니다. 아래 코드 스 니펫을 확인하세요.
@RestController
@Validated
public class FooController {
@RequestMapping(value = "/foo", method = RequestMethod.GET)
@ResponseBody
public Foo getFoo(
@RequestParam (required = false)
@NotNull(message = "Required LocalDate parameter dateFrom is not present")
LocalDate dateFrom,
@RequestParam (required = false)
@NotNull(message = "Required LocalDate parameter dateTo is not present")
LocalDate dateTo)
) {
// Do stuff
}
}
@ControllerAdvice
public class ExceptionController {
@ExceptionHandler({ConstraintViolationException.class})
public ResponseEntity<List<ErrorResponseDTO>> exceptionHandler(ConstraintViolationException e) {
List<ErrorResponseDTO> errors = new ArrayList<>(e.getConstraintViolations().size());
e.getConstraintViolations().forEach(violation -> errors.add(new ErrorResponseDTO(violation.getMessage())));
return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
}
}
결과는 다음과 같습니다.
[
{
"reason": "Required LocalDate parameter dateFrom is not present"
},
{
"reason": "Required LocalDate parameter dateTo is not present"
}
]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다