为什么bean验证最小/最大约束不支持双精度类型?

问题描述 投票:21回答:2

[有人可以向我解释为什么JPA支持double类型作为字段类型,但是javax.validation.constraints中的bean验证约束(即@Min / @Max)不支持它吗?我知道文档说这是由于舍入错误引起的,但是如果我选择字段类型为double,我已经承认我不太在乎显式精度。

我遇到这个难题的情况如下:我有一个实体,它代表地球表面上的一个点。如果精度在几厘米以内,那就很好。看起来像这样:

@Entity
public class Point {

    /**
     * The longitude in radians.
     */
    @Min(-Math.Pi)
    @Max(Math.Pi)
    double longitude;
    /**
     * The latitude in radians.
     */
    @Min(-Math.Pi / 2)
    @Max(Math.Pi / 2)
    double latitude;

}

遗憾的是,这不起作用,因为注释不支持双精度类型。但是使用BigDecimal并不是真正的选择,因为我需要进行大量计算并且要处理多个点,因此仍然需要相当快的速度。我通过定义一个适用于double的自定义约束检查来解决了这个问题,但是总的来说,我认为我缺少某些东西。所以,我想念什么?

java constraints precision bean-validation
2个回答
6
投票

是因为四舍五入。但这不是因为双精度数可能不足以正确表达所需数字的问题。 (MinMax的注释值)的类型多于long,因此它不能表示任何带小数位的数字。另一方面,不能使用双精度来表示长整数可以表示的所有数字。

因此,API设计人员必须决定两种方式之一(长或双)


0
投票

使用@DecimalMin批注。您将需要传递一个原义的String值,因为attrubute值必须为常量(String.valueOf(-Math.PI))不起作用。它用于验证Double属性。

@DecimalMin(value = "0.01", message = "Your message...") private Double longitude;

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