У меня есть поле enum в Spring DTO, которое я использую в @RestController
. sh Чтобы создать пользовательское сообщение об ошибке при неудачной проверке для этого поля enum:
public class ConversionInputDto {
// validation annotations
private BigDecimal sourceAmount;
// enum field
@NotNull(message = ERROR_EMPTY_VALUE)
private CurrencyFormat targetCurrency;
// no-args constructor and getters
}
Получение ввода в виде строки и создание пользовательской аннотации в моем случае кажется излишним, а другая альтернатива, которую я знаю, перехватывает все InvalidFormatException
ошибки через @ControllerAdvise
и возвращает ту же ошибку для них (таким образом, пользователь, отправляющий, например, свойство String input для Numberri c, получит то же сообщение об ошибке):
@ExceptionHandler(InvalidFormatException.class)
public void handleInvalidEnumAndAllOtherInvalidConversions(HttpServletResponse response) throws IOException {
response.sendError(HttpStatus.BAD_REQUEST.value(), ERROR_MESSAGE);
}
Текущая ошибка проверки по умолчанию слишком длинная, и я хотел бы сделать ее более удобной для пользователя, например "Недопустимое значение формата валюты. Пожалуйста, выберите между ...." :
"Неверный JSON ввод: Невозможно десериализовать значение типа com.foreignexchange.utilities.CurrencyFormat
из строки \" test \ ": ни одно из значений, принятых для класса Enum: [AUD, PLN, MXN, USD, CAD]; вложенное исключение: com.faster xml .jackson.databind.ex c .InvalidFormatException: Невозможно десериализовать значение типа com.foreignexchange.utilities.CurrencyFormat
из String \ "test \": ни одно из значений, принятых для класса Enum: [AUD, PLN, MX N, USD, CAD] \ n в [Source: (PushbackInputStream); строка: 3, столбец: 20] (через цепочку ссылок: com.foreignexchange.models.ConversionInputDto [\ "targetCurrency \"]) ",
Существует ли элегантный способ решения этой проблемы? Возможно, с какие-то дополнительные логики c в @ExceptionHandler
проверке, какое поле не прошло проверку?