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



有人能向我解释一下为什么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 s一起工作的自定义约束检查来解决这个问题,但不知何故,我认为在整个故事中我缺少了一些东西。那么,我错过了什么?

使用@DecimalMin注释。您需要传递一个字符串值,因为属性value必须是常量(String)。valueOf(- Math.PI))不起作用。它可以验证双属性。

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

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

所以API设计者必须在两种方式中选择一种(长或双)

最新更新