2011-09-26 6 views
7

sto cercando di fare la convalida multipla uno un campopiù validatori in un campo con la validazione JSF fagioli

@NotBlank(message = "{name.required}") 
    @Max(value = 25, message = "{long.value}") 
    public String name; 

JSF:

<h:inputText id="name" value="#{person.name}" size="20"> 
</h:inputText> 
<h:message for="name" style="color:red" /> 

ma quando lascio il campo vuoto, mostra sia l'errore messaggi.

qualsiasi idea su come gestire entrambi i casi, convalidare la lunghezza vuota e massima indipendentemente.

+0

è strano, non so perché, ma quando ho usato @Size e gli ho dato il massimo, tutto funziona come previsto, qualche idea? –

+1

'@ Size' e' @ Max' non sono gli stessi. '@ Size' convalida la lunghezza del valore di input della stringa. '@ Max' convalida il valore numerico di qualsiasi valore di input numerico. Per esempio. 26 non passerebbe '@Max (25)'. – BalusC

risposta

5

Se la configurazione JSF 2 interpretare valori presentati vuote come "" e non null poi:

Il @NotBlank validatore restituisce false perché il vostro annotato stringa è vuota.

Il validatore @Max restituisce false perché secondo l'implementazione di ibernazione (suppongo che si stia utilizzando la base di implementazione di ibernazione nei post precedenti).

public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { 
     //null values are valid 
     if (value == null) { 
      return true; 
     } 
     try { 
      return new BigDecimal(value).compareTo(BigDecimal.valueOf(maxValue)) != 1; 
     } 
     catch (NumberFormatException nfe) { 
      return false; 
     } 
    } 

Nel tuo caso il parametro value stringa contiene un valore vuoto ("") e la (String) BigDecimal genera un'eccezione e quindi il validatore ritorna false.

Hai due possibili soluzioni:

+0

Bella cattura! In tal caso, l'OP può anche usare '@ NotNull' al posto di hibernate-impl-specific' @ NotBlank'. – BalusC