Spring中验证失败时枚举字段上的自定义错误消息



我的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
} 

在我的情况下,以字符串形式接收输入并进行自定义注释似乎有些过头了,而另一种选择,我知道,通过@ControllerAdvise捕获所有InvalidFormatException错误,并为它们返回相同的错误(因此,提交例如数字属性的字符串输入的用户将获得相同的错误消息(:

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

当前的默认验证错误太长,我想让它更用户友好,比如"无效的货币格式值。请在…之间选择。">

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

有没有一种优雅的方法来解决这个问题?也许@ExceptionHandler中有一些额外的逻辑来检查哪个字段未通过验证?

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

最新更新