Получить отсутствующие поля при возникновении исключения HttpMessageNotReadableException - PullRequest
1 голос
/ 02 августа 2020

У меня есть API, который ожидает следующую структуру dto.

data class SignupRequest(
    @NotEmpty(message ="Username must not be empty")
    @NotNull(message = "Username must not be null")
    val username: String,

    @NotEmpty(message ="Password must not be empty")
    @NotNull(message = "Password must not be null")
    val password: String,

    @NotEmpty(message ="Email must not be empty")
    @NotNull(message = "Email must not be null")
    val email: String
)

Ниже показан контроллер

@RestController
class AuthenticationController {
   @Autowired
   private lateinit var userRepository: UserRepository

   @PostMapping("/signup")
   @ResponseStatus(HttpStatus.CREATED)
   fun signup(@Valid @RequestBody request: SignupRequest) : SignupResponse {
      val user = User(
            id = UUID.randomUUID(),
            username = request.username,
            password = request.password,
            email = request.email
    )

       try {
          userRepository.save(user)
          return SignupResponse(msg = "Success");
       } catch (e: Exception) {
          throw ResponseStatusException(HttpStatus.BAD_GATEWAY, "Invalid fields", e)
       }
   }
}

Когда я вызываю API, если какое-либо из полей отсутствует или null, я получаю HttpMessageNotReadableException, и поскольку сообщение об ошибке по умолчанию не имеет особого смысла для клиента, я пытаюсь отформатировать его, указав обработчик ошибок для этого исключения.

@RestControllerAdvice
class ApiExceptionHandler {

   @ExceptionHandler(HttpMessageNotReadableException::class)
   fun handleMessageNotReadableException(
        ex: HttpMessageNotReadableException,
        req: HttpServletRequest,
        res: HttpServletResponse
   ) : ResponseEntity<ApiError> {
       val error = ApiError();
       return ResponseEntity<ApiError>(error, HttpStatus.BAD_REQUEST)
   }

}

Однако я также необходимо знать точные поля, которые отсутствуют, и хотя сообщение об ошибке по умолчанию содержит эту информацию, объект исключения не имеет ее, я также не могу расширить ResponseEntityExceptionHandler, потому что тогда я должен предоставить реализации для всех случаев по умолчанию. обрабатывает.

Как мне легко и правильно вернуть недостающие поля в вызове API

...