2011-01-14 11 views
7

Ho un'applicazione Java EE e voglio convalidare una data. con una stringa che fare questo:JSR 303 - javax.validation - Convalida una data

import javax.validation.constraints.NotNull; 
import javax.validation.constraints.Size; 
... 
@NotNull 
@Size(min = 1, max = 255) 
private String myString; 

Ma ora ho due date che voglio per convalidare. L'utente può nel sistema di frontend scrivere una stringa in un campo di testo che sarà trasferito tramite JSON (devo usare il campo di testo, non posso usare un datepicker).

Quindi il mio backend non ha questo nella mia classe di dominio:

@DateTimeFormat(pattern = "dd.MM.yy") 
@Temporal(value=TemporalType.TIMESTAMP) 
private Date myStartDate; 

@DateTimeFormat(pattern = "dd.MM.yy") 
@Temporal(value=TemporalType.TIMESTAMP) 
private Date myEndDate; 

voglio per convalidare contro il "gg.mm.aaaa" formato. Come si può fare?

E, io non la penso così, ma c'è una convalida automatica per verificare se la data di inizio è prima della data di fine? Ho trovato solo @Future e @Past.

Quindi l'unica soluzione è usare un @Pattern, un'espressione regolare ?!

Grazie in anticipo per il vostro aiuto, Cordiali saluti.

+2

Un paio di cose: il '@ DateTimeFormat' non fa parte di JSR-303 e' mm' sta per minuti, non mesi. Inoltre, come la modifica di '" dd.MM.yy "' a '" dd.MM.yyyy "' fallisce? Poiché sembra che tu stia usando Spring MVC (di cui questa annotazione fa parte), potresti voler rivedere/ritirare la tua domanda. Almeno, JSR 303 non offre [any] (http://download.oracle.com/javaee/6/api/javax/validation/constraints/package-summary.html) annotazioni per questo. – BalusC

+0

Sì, posso passare a 'gg.MM.aaaa', ma non c'è alcuna convalida. – Tim

+0

Non riesco a capire come la convalida del pattern sia utile su un 'Date' invece che su' String' dato che 'Date' non memorizza alcuna informazione sul suo formato interno. Ad ogni modo, non faccio Spring, ma penso che sia necessario implementare un [Validator] (http://static.springsource.org/spring/docs/3.0.x/reference/validation.html). Questo è almeno come lo farei se fosse JSF. – BalusC

risposta

3

@DateTimeFormat viene utilizzato durante l'associazione dati Web, quando si mappano i parametri di richiesta su un oggetto (supponendo che sia stato abilitato con <mvc:annotation-driven/> o manualmente). Di solito non verrà utilizzato per deserializzare JSON in un oggetto. Come stai leggendo nel tuo JSON? Cosa stai usando per deserializzare? Non è possibile convalidare un oggetto Date java dopo il fatto per la formattazione, è necessario controllare in anticipo prima della deserializzazione.

Non ci sono vincoli multi-campo integrati. Dovrai scrivere il tuo vincolo a livello di tipo se vuoi confrontare due proprietà su un oggetto.

+0

Grazie per la risposta. Voglio convalidarlo con '@Pattern (regexp =" \ t (0 [1-9] | [12] [0-9] | 3 [01]) [- /.] (0 [1-9] | 1 [012]) [- /.] (19 | 20) \ d \ d \ t ")', ma c'è un errore che è una sequenza di escape non valida. Sì, posso verificarlo prima di inviarlo al sistema di back-end, ma non ho accesso al frontend sistema, io sono solo il "backend master" e devo controllare se il formato della data è ok, quindi il Pattern sarà sufficiente nel primo passo. – Tim

+0

devi raddoppiare tutto tu \\ in una regex java, dato che \ è già il carattere di escape per le stringhe java, prima che vada al motore regex. – Affe

Problemi correlati