Настраиваемое сообщение об ошибке в поле enum при неудачной проверке в Spring - PullRequest
0 голосов
/ 21 марта 2020

У меня есть поле 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 проверке, какое поле не прошло проверку?

1 Ответ

0 голосов
/ 21 марта 2020

Благодаря комментариям я нашел решение, используя isAssignableFrom() для предоставления пользовательских сообщений об ошибках для неудачной проверки перечисления:

@ExceptionHandler(InvalidFormatException.class)
public void handleOfflineBankApi(HttpServletResponse response, InvalidFormatException ex) throws IOException {
    if (ex.getTargetType().isAssignableFrom(CurrencyFormat.class)) {
        response.sendError(HttpStatus.BAD_REQUEST.value(), Constants.ERROR_INVALID_CURRENCY_FORMAT);
    } else {
        response.sendError(HttpStatus.BAD_REQUEST.value(), ex.getMessage());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...