У меня есть 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