【问题标题】:Validation for max Int , max long values [duplicate]验证 max Int , max long 值[重复]
【发布时间】:2020-05-18 07:58:42
【问题描述】:

我正在编写rest api,我们在RequestBody中接受dto,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) 超出 int 范围; 嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException:数值 (2147483648) 超出 int 范围。

那么是否有任何其他注释可以实现这一点,或者我必须通过异常处理来做到这一点?

【问题讨论】:

  • @Sambit ,不,它没有回答我的问题。
  • 此验证不起作用,因为无法为int 类型的字段分配更大的值,因此您添加的验证将永远不会触发。您需要将字段类型设为 long 才能执行此操作。

标签: java rest validation exception dto


【解决方案1】:

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

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

在当前验证到位的情况下,该值也在可以映射到int 的范围内以获取正值。 然而,这是一个设计决定。

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      这还将使您能够根据您的要求将数据转换为 int 或 long。通过使用字符串作为 ID,您可以消除数据类型的最大限制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 2017-09-23
        相关资源
        最近更新 更多