【问题标题】:Custom error message on enum field upon failed validation in Spring在 Spring 中验证失败时枚举字段上的自定义错误消息
【发布时间】:2020-07-02 10:40:06
【问题描述】:

我的 Spring DTO 中有一个枚举字段,我在 @RestController 中使用它。我希望在此枚举字段验证失败时创建自定义错误消息:

public class ConversionInputDto {

    // validation annotations
    private BigDecimal sourceAmount;

    // enum field
    @NotNull(message = ERROR_EMPTY_VALUE)
    private CurrencyFormat targetCurrency;

    // no-args constructor and getters
} 

在我的情况下,将输入作为字符串接收并创建 custom annotation 似乎有点过头了,而我知道的另一种选择通过 @ControllerAdvise 捕获所有 InvalidFormatException 错误并为它们返回相同的错误(因此,用户提交例如数字属性的字符串输入将得到相同的错误消息):

@ExceptionHandler(InvalidFormatException.class)
public void handleInvalidEnumAndAllOtherInvalidConversions(HttpServletResponse response) throws IOException {
    response.sendError(HttpStatus.BAD_REQUEST.value(), ERROR_MESSAGE);
}

当前默认验证错误太长,我想让它更人性化,例如“无效的货币格式值。请在...之间选择。”

"无效的 JSON 输入:无法反序列化类型的值 com.foreignexchange.utilities.CurrencyFormat 来自字符串 \"test\": 不是枚举类接受的值之一:[AUD, PLN, MXN, USD, 加元];嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidFormatException:不能 反序列化类型的值 com.foreignexchange.utilities.CurrencyFormat 来自字符串 \"test\": 不是枚举类接受的值之一:[AUD, PLN, MXN, USD, CAD]\n 在 [Source: (PushbackInputStream);行:3,列:20] (通过参考链: com.foreignexchange.models.ConversionInputDto[\"targetCurrency\"])",

有没有优雅的方法来解决这个问题?也许在@ExceptionHandler 中添加一些额外的逻辑来检查哪个字段验证失败?

【问题讨论】:

标签: java spring spring-boot rest enums


【解决方案1】:

感谢 cmets,我找到了一个解决方案,使用 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());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多