Domanda

Il problema che sto riscontrando è che il mio Bean Validation non funziona come mi aspetterei.

Ho un bean gestito con ambito sessione con a name campo che è associato a un h:inputText.Il nome deve essere inserito e avere una lunghezza minima di 1 carattere e una lunghezza massima di 5 caratteri.Mi aspetto che quando inserisco il nome nella casella di testo, verrà convalidato di conseguenza dal bean di supporto e, se fallisce, visualizzerà i messaggi di errore corrispondenti.

Tuttavia, questo non è il caso. Le convalide falliscono sempre, anche se inserisco un caso valido in inputText (ad es."abc").Durante il debug dell'applicazione, sembra che il file getName() l'accessor viene sempre chiamato e il setter non viene mai raggiunto.Sto facendo qualcosa di sbagliato?Presumo che il validatore utilizzi l'accessor per convalidare, ma il problema è che il setter non ha mai la possibilità di aggiornare il valore del nome...Devo essermi perso qualcosa.

Di seguito è riportato il Bean gestito:

@ManagedBean
@SessionScoped
public class James implements Serializable {

  public James() {
    super();
   }

  private String name;

  @NotNull
  @Min(value = 1)
  @Max(value = 5)
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

Di seguito è riportato il frammento dell'xhtml JSF.Ho provato alcune varianti diverse con moduli separati, ma la prima opzione è quella che suppongo funzioni (penso che sia equivalente alla terza opzione, ma l'ho provata per ogni evenienza :))

<h:messages/>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}"/>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}" immediate="true"/>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>
<h:form>
  <h:inputText id="jamesName" value="#{james.name}">
    <f:validateBean />
  </h:inputText>
  <h:message for="jamesName"/>
  <h:commandButton value="submit"/>
</h:form>

Utilizzo JSF 2.0.2-FCS con Hibernate Entity Manager 3.3.2.GA e Hibernate Validator 4.0.2.GA (di seguito sono riportate le parti rilevanti del mio Maven POM), in esecuzione in Tomcat 6.0.20 su Windows XP Pro Service Pacchetto 3 (32 bit).

<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-api</artifactId>
  <version>2.0.2-FCS</version>
</dependency>
<dependency>
  <groupId>javax.faces</groupId>
  <artifactId>jsf-impl</artifactId>
  <version>2.0.2-FCS</version>
</dependency>
<dependency>
  <groupId>javax.servlet</groupId>
  <artifactId>jstl</artifactId>
  <version>1.2</version>
</dependency>
<dependency>
  <groupId>javax.servlet.jsp</groupId>
  <artifactId>jsp-api</artifactId>
  <version>2.1</version>
  <scope>provided</scope>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>3.3.2.GA</version>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>4.0.2.GA</version>
</dependency>
È stato utile?

Soluzione

La tua convalida funziona correttamente.Il problema riguarda le annotazioni @Min e @Max:

@NotNull
@Min(value = 1)
@Max(value = 5)
public String getName() {
    return name;
}

@Min e @Max sono pensati per il confronto numerico.Hai scritto:

Il nome deve essere inserito e avere una lunghezza minima di 1 carattere e una lunghezza massima di 5 caratteri

Dovresti invece utilizzare l'annotazione @Size, come in:

@NotNull
@Size(min = 1, max = 5)
public String getName() {
    return name;
}

I campi del bean non vengono aggiornati perché la convalida fallisce.Solo dopo che la convalida ha esito positivo il bean verrà aggiornato.

Altri suggerimenti

Per quanto riguarda la tua domanda aggiuntiva: vedi questa matrice - no, non sono compatibili.

Informazioni sulla domanda JSF: controlla sia i registri di Tomcat che la console JavaScript di Firefox.

Per generare un errore di compilazione in questo tipo di caso, possiamo utilizzare il processore di annotazioni di Hibernate Validator.validatore di ibernazione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top