Validated Spring RestController에서 누락 된 여러 요청 매개 변수의 세부 사항을 어떻게 얻습니까?

DaveyDaveDave

나는이 개 봄의 유효성 검사를 사용하려고 시도하는거야 @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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관