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

有人可以向我解释为什么JPA支持该类型作为字段类型,但bean验证组件(即@Min/ @Max)不支持它吗?我知道文档说这是由于舍入错误造成的,但是如果我选择字段类型,我已经承认我不太关心显式精度。doublejavax.validation.constraintsdouble

我遇到这个困境的场景如下:我有一个实体,它代表地球表面上的一个点。如果精度在几厘米以内,那就没问题了。它看起来像这样:

@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;

}

不幸的是,这不起作用,因为注释不支持双精度类型。但是使用而不是一个真正的选择,因为我有一些广泛的计算,其中有多个点,仍然需要相当快。我通过定义一个与s一起使用的自定义约束检查来解决这个问题,但不知何故,我认为整个故事中缺少一些东西。那么,我错过了什么呢?BigDecimaldouble


答案 1

使用批注。您将需要传递一个文本字符串值,因为 attrubute 必须是常量(String.valueOf(- Math.PI))不起作用。它的工作原理是验证 Double 属性。@DecimalMinvalue

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

答案 2

这是因为四舍五入。但不是因为双精度可能不够正确,无法表达您想要的数字。更多的是注释值(和)是长类型,因此它不能用小数位表示任何数字。另一方面,您不能使用双精度来表示长者可以表示的所有数字。MinMax

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


推荐