Frage

Das Problem, das ich habe, ist, dass mein Bean Validation nicht so funktioniert, wie ich würde erwarten, .

Ich habe eine Session Scoped Managed Bean mit einem name Feld, das an einem h:inputText gebunden ist. Der Name muss eingegeben werden, und eine Mindestlänge von 1 Zeichen, und eine maximale Länge von 5 Zeichen. Ich gehe davon aus, dass, wenn ich den Namen in das Textfeld eingeben, wird es entsprechend durch die Backing Bean validiert werden, und wenn es scheitert, dann wäre es die entsprechenden Fehlermeldungen angezeigt werden.

Dies ist jedoch nicht der Fall. Die Validierungen sind immer zum Scheitern verurteilte , auch wenn ich einen gültigen Fall in der input (beispielsweise „abc“) eingeben. Auf Debuggen der Anwendung, so scheint es, dass die getName() Accessor wird immer dann aufgerufen, und die Setter nie erreicht wird. Mache ich etwas falsch? Ich gehe davon aus der Validator die Accessor Validate verwendet, aber das Problem ist, dass die Setter nie eine Chance bekommt, den Wert des Namens zu aktualisieren ... Ich muss etwas fehlen.

Im Folgenden finden Sie die Managed Bean:

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

Im Folgenden ist das Fragment des JSF xhtml. Ich habe versucht, ein paar verschiedene Variationen mit getrennten Formen, aber die erste Option ist die, die ich an der Arbeit übernehmen würde (ich glaube, es in der dritten Option gleichwertig ist, aber versuchte, nur für den Fall :))

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

Ich verwende JSF 2.0.2-FCS mit Hibernate Entity-Manager 3.3.2.GA und Hibernate Validator 4.0.2.GA (unten sind die relevanten Teile aus meinem Maven POM), in Tomcat 6.0.20 unter Windows XP Pro Service Pack 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>
War es hilfreich?

Lösung

Ihre Validierung ordnungsgemäß funktioniert. Das Problem ist, mit Ihren @Min und @Max Anmerkungen:

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

@Min und @Max sind für numerischen Vergleich gemeint. Sie schrieb:

  

Der Name eingegeben werden muss, und eine Mindestlänge von 1 Charakter hat und eine maximale Länge von 5 Zeichen

Sie sollten @size Anmerkung verwenden, anstatt, wie es in:

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

Die Bohnenfelder werden nicht aktualisiert, da die Validierung fehlschlägt. Erst nachdem die Validierung erfolgreich ist wird der Bean aktualisiert.

Andere Tipps

Wie für Ihre weitere Frage - sehen diese Matrix - nein, sie sind nicht kompatibel.

Über die JSF Frage. - Überprüfen Sie beide tomcat-Protokolle und die firefox javascript Konsole

Um einen Übersetzungsfehler in dieser Art von Fall zu erhöhen, können wir Hibernate Validator Annotation-Prozessor verwenden. Hibernate Validator

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top