最大Int的验证,最大long值

问题描述 投票:0回答:3

我正在在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)超出整数范围。

所以还有其他注释可以用来实现此目的,还是我必须通过异常处理来做到这一点?

java rest validation exception dto
3个回答
0
投票

不幸的是,它不能完全那样工作。问题是,它永远都无法得到验证。而且永远不会。首先,它尝试解析它并将值插入int。由于太大,因此无法映射。如果您要输入其他任何值,则可以进行验证。

恐怕您是正确的,唯一的其他方法是处理异常。

  1. 如果您使用的是Spring,则可以使用@ControllerAdvice实现所需的功能。 Controller Advice docs
  2. 或者您可以使用BindingResult,它将为您提供发生的错误,然后您可以根据需要对其进行处理。

0
投票

int,根据定义,最多只能处理Integer.MAX_VALUE

无论如何,另一个想法可能是将dto int设计为long值,以便无论所传递的值有多大,都可以始终转换该值。

使用当前验证时,该值也在一个范围内,可以将其映射为int为正值。但是,这是设计决定。

只是另一个提示:我所看到的验证预见了正值,但是负值呢?


0
投票

您是否考虑将代码字段设置为String?尝试验证提供的输入数据时,可以使用BigInteger验证传入的值是否在期望的范围内。

 if (new BigInteger(value).compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) > 0
        || new BigInteger(value).equals(BigInteger.ZERO))

这还将使您能够根据需要将数据转换为int或long的控件。通过使用字符串作为ID,您消除了最大化数据类型限制的情况。

© www.soinside.com 2019 - 2024. All rights reserved.