2011-03-07 14 views
11

Ci scusiamo se questa domanda è stata trattata da qualche parte prima. Se mi ha collegato per favore, non ho ancora trovato una risposta soddisfacente.Errore di convalida della validazione javax più specifico

Mi sono guardato intorno cercando di trovare un modo per avere i messaggi di errore forniti dalla mia convalida javax più specifici.

Il messaggio Al momento ho per la mia @Min annotazione è specificato nel file ValidationMessages.properties:

javax.validation.constraints.Min.message=The value of this variable must be less than {value}. 

e questo viene stampato come ci si aspetterebbe

The value of this variable must be less than 1 

Quello che vorrei have è il messaggio include anche il nome della variabile (e della classe) che ha fallito la convalida e il valore della variabile che ha fallito. Quindi più simile.

The value of class.variable was 0 but not must be less than 1 

Qualsiasi aiuto sarebbe molto apprezzato.

Klee

risposta

13

Hmmm. Fastidioso! Come la vedo io si hanno 3 opzioni:

  1. si potrebbe scrivere un costume MessageInterpolator e sostituire nella tua configurazione di convalida, ma questo è sembra davvero fragile.

  2. Si potrebbe dichiarare la propria annotazione personalizzato in-the-stile di @Min (see how to do a custom validator here) ...

  3. .. Ma le informazioni necessarie è effettivamente tenuto all'interno dell'oggetto ConstraintViolation che esce dalla Istanza di Validator. È solo che non viene inserito nel messaggio predefinito.

Suppongo che tu stia attualmente utilizzando una sorta di framework web per convalidare un modulo. Se questo è il caso, dovrebbe essere abbastanza semplice scavalcare la validazione e fare qualcosa di simile (versione hacky veloce, dovresti essere in grado di renderlo molto ordinato usando un file di proprietà esterno):

 
    Set<ConstraintViolation<MyForm>> violations = validator.validate(form); 
    for (ConstraintViolation<MyForm> cv : violations) { 
    Class<?> annoClass = cv.getConstraintDescriptor().getAnnotation().getClass(); 
    if (Min.class.isAssignableFrom(annoClass)) { 
     String errMsg = MessageFormat.format(
     "The value of {0}.{1} was: {2} but must not be less than {3}", 
     cv.getRootBeanClass(), 
     cv.getPropertyPath().toString(), 
     cv.getInvalidValue(), 
     cv.getConstraintDescriptor().getAttributes().get("value")); 
      // Put errMsg back into the form as an error 
    } 
    } 
1

Credo che sia necessario creare un vincolo personalizzato.
Non hai menzionato quale implementazione delle specifiche stai usando, ma c'è una buona documentazione su come creare un vincolo personalizzato per Hibernate Validator here.

Parte del processo comporterà la creazione del file i propri ValidationMessages.properties

Problemi correlati