为什么bean验证Min / Max约束不支持double类型?

时间:2011-09-14 20:49:31

标签: java constraints precision bean-validation

有人可以向我解释为什么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;

}

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

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

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