2011-09-14 14 views
20

¿Podría alguien explicarme por qué el JPA admite el tipo double como un tipo de campo, pero los constantes de validación del bean en javax.validation.constraints (es decir, @Min/@Max) no lo admiten? Sé que la documentación dice que esto se debe a errores de redondeo, pero si elijo el tipo de campo para ser double, ya admito que no me importa demasiado la precisión explícita.¿Por qué la validación de beans Las restricciones mínimas/máximas no admiten el tipo doble?

El escenario me encontré con este dilema es el siguiente: Tengo una entidad que representa un punto de la superficie de la Tierra. Si la precisión está dentro de unos pocos centímetros, está bien. Se ve algo como esto:

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

} 

Desafortunadamente esto no funciona, debido a que las anotaciones no son compatibles con el tipo doble. Pero el uso de BigDecimal en cambio no es realmente una opción, porque tengo un cálculo extenso con múltiples puntos que aún deben ser razonablemente rápidos. Lo resolví definiendo una verificación de restricción personalizada que funciona con double s, pero de alguna manera creo que hay algo que me falta en toda la historia. Entonces, ¿qué me estoy perdiendo?

+0

Tenga en cuenta que la APP y Bean Validation son dos APIs totalmente independientes. Arreglé el título, algunas palabras y etiquetas en consecuencia. Brillante ejemplo de pregunta por cierto. ¿Qué implementación de Validación Bean está usando? Validador de Hibernate? – BalusC

+0

Sí, en este momento estoy usando Hibernate Validator. –

+1

Puede anotar un doble con Mín. O Máx. (Al menos en Hibernate Validator). El tipo doble es compatible. Su problema parece ser que no puede especificar un doble como parámetro de restricción. Allí la especificación de hecho hace cumplir un largo. ¿Has considerado usar DecimalMin y DecimalMax? Puede especificar sus valores mínimo y máximo como cadenas. – Hardy

Respuesta

6

Es debido al redondeo. Pero no por el problema de que un doble no sea lo suficientemente correcto como para expresar el número que desea. Es más que el valor de anotación (de Min y Max) es de tipo largo, por lo que no puede expresar ningún número con decimales. Por otro lado, no puedes usar un doble para expresar exactamente todos los números que puede expresar un largo.

Así que los diseñadores de la API tuvo que decidir por una de las dos maneras (largos o dobles)

+0

Gracias por esa idea, no lo miré desde ese punto de vista. Pero como 'long' y' double' ambos usan 64 bits, existe un isomorfismo que preserva la comparación. Supongo que este isomorfismo no está integrado en 'Double' o' Float', pero no debería ser un problema más complejo que convertir un 'BigDecimal' en' long'. Entonces, esto explica por qué el soporte para 'double's no está incorporado, pero muestra que es posible. Y eso debería ser suficiente para ser compatible, IMO. –

Cuestiones relacionadas