我正在在RestBody中接受dto的地方编写rest api,dto已提交其数据类型为int的文件。我要实现的是,当用户尝试输入大于Integer.MAX_VALUE的值时,我想给出错误,因为“值必须小于2147483648”。我尝试使用
验证dto@Max(value = Integer.MAX_VALUE, message = "Code must be less than 2147483648")
private int code;
其中@Max来自javax.validation.constraints.Max。
但是我得到了,JSON解析错误:数值(2147483648)超出整数范围;嵌套的异常是com.fasterxml.jackson.databind.JsonMappingException:数值(2147483648)超出整数范围。
所以还有其他注释可以用来实现此目的,还是我必须通过异常处理来做到这一点?
不幸的是,它不能完全那样工作。问题是,它永远都无法得到验证。而且永远不会。首先,它尝试解析它并将值插入int
。由于太大,因此无法映射。如果您要输入其他任何值,则可以进行验证。
恐怕您是正确的,唯一的其他方法是处理异常。
@ControllerAdvice
实现所需的功能。 Controller Advice docsint
,根据定义,最多只能处理Integer.MAX_VALUE
。
无论如何,另一个想法可能是将dto int
设计为long
值,以便无论所传递的值有多大,都可以始终转换该值。
使用当前验证时,该值也在一个范围内,可以将其映射为int
为正值。但是,这是设计决定。
只是另一个提示:我所看到的验证预见了正值,但是负值呢?
您是否考虑将代码字段设置为String?尝试验证提供的输入数据时,可以使用BigInteger验证传入的值是否在期望的范围内。
if (new BigInteger(value).compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0
|| new BigInteger(value).equals(BigInteger.ZERO))
这还将使您能够根据需要将数据转换为int或long的控件。通过使用字符串作为ID,您消除了最大化数据类型限制的情况。