2011-09-14 6 views
20

Qualcuno potrebbe spiegarmi perché l'JPA supporta il tipo double come tipo di campo, ma i valori di convalida del bean in javax.validation.constraints (ad esempio @Min/@Max) non lo supportano? So che la documentazione dice che questo è dovuto a errori di arrotondamento, ma se scelgo il tipo di campo da double, ammetto che non mi interessa molto della precisione esplicita.Perché i limiti Min/Max di convalida del bean non supportano il doppio tipo?

Lo scenario in cui mi sono imbattuto in questo dilemma è il seguente: Ho un'entità che rappresenta un punto sulla superficie terrestre. Se la precisione è di pochi centimetri, va bene. Assomiglia a questo:

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

} 

Sfortunatamente questo non funziona, perché le annotazioni non supportano il tipo doppio. Ma usare BigDecimal invece non è davvero un'opzione, perché ho un ampio calcolo con più punti in corso che deve essere abbastanza veloce. Ci ho lavorato attorno definendo un controllo dei vincoli personalizzati che funziona con double s, ma in qualche modo penso che ci sia qualcosa che mi manca nell'intera storia. Quindi, cosa mi sto perdendo?

+0

Si prega di notare che l'APP e Bean Validation sono due API completamente separate. Ho corretto il titolo, alcune parole e tag di conseguenza. Esempio di domande brillanti btw. Quale implementazione di Bean Validation stai usando? Hibernate Validator? – BalusC

+0

Sì, ora sto usando Hibernate Validator. –

+1

È possibile annotare un doppio con Min o Max (almeno in Hibernate Validator). Il doppio tipo è supportato. Il tuo problema sembra essere che non puoi specificare un doppio come parametro di vincolo. Lì le specifiche effettivamente impongono un lungo. Hai preso in considerazione l'utilizzo di DecimalMin e DecimalMax? È possibile specificare i valori minimo e massimo come stringhe. – Hardy

risposta

6

È a causa dell'arrotondamento. Ma non a causa del problema che un doppio potrebbe non essere sufficiente per esprimere il numero desiderato. È più che il valore di annotazione (di Min e Max) è di tipo lungo, quindi non può esprimere alcun numero con posizioni decimali. D'altra parte non è possibile utilizzare una doppia per esprimere esattamente tutti i numeri che una lunga può esprimere.

Così i progettisti API hanno dovuto decidere per uno dei due modi (lunghe o doppie)

+0

Grazie per l'intuizione, non l'ho guardato da quel punto di vista. Ma poiché 'long' e' double' usano entrambi 64 bit, c'è un isomorfismo che preserva il confronto. Immagino che questo isomorfismo non sia incorporato in 'Double' o' Float', ma non dovrebbe essere un problema più complesso della conversione di 'BigDecimal' in' long'. Quindi, questo spiega perché il supporto per 'double's non è integrato, ma mostra che è possibile. E questo dovrebbe essere sufficiente per essere supportato, IMO. –