Wir haben kürzlich unsere Systeme von JSF 1.2 auf JSF 2.0 aktualisiert und sind dabei, alles zum Laufen zu bringen. Es treten jedoch Probleme mit Validierern auf, wenn sie in Datentabellen oder ähnlichen Komponenten verwendet werden. Das Problem besteht darin, dass der Validierer die von der Datentabelle festgelegte Variable nicht verwenden kann.JSF 2-Validatoren können nicht "var" von dataTable verwenden
Hier ist ein Beispiel:
VALIDATOR:
package test;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
@FacesValidator("test.TestValidator")
public class TestValidator implements Validator {
private Integer length;
public TestValidator() {
super();
}
@Override
public void validate(FacesContext context,
UIComponent component, Object value) throws ValidatorException {
String text = (String) value;
if (text == null || text.trim().length() == 0) {
return;
}
if (length != null && text != null && length.intValue() < text.length()) {
String message = "The text is too long. It was " + text.length() +
", but only " + length + " characters are allowed.";
FacesMessage fm = new FacesMessage(
FacesMessage.SEVERITY_ERROR, message, null);
throw new ValidatorException(fm);
}
}
public Integer getLength() {
return length;
}
public void setLength(Integer length) {
this.length = length;
}
}
TagLib:
<?xml version="1.0" encoding="UTF-8"?>
<facelet-taglib
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://industry-supply.dk/test</namespace>
<tag>
<tag-name>testValidator</tag-name>
<validator>
<validator-id>test.TestValidator</validator-id>
</validator>
<attribute>
<name>length</name>
<required>true</required>
<type>java.lang.Integer</type>
</attribute>
</tag>
</facelet-taglib>
MANAGED BEAN:
package test;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean(name = "testBean")
@RequestScoped
public class TestBean {
public TestBean() {
}
public String[] getKey() {
return new String[]{
"0",
"1",
"2",
"3"
};
}
public String[] getValue() {
return new String[]{
"This is a text and it's too long.",
"This is a text and it's too long.",
"This is a text and it's too long.",
"This is a text and it's too long."
};
}
}
JSF:
Beim Ausführen des Projekts werden 4 Eingabefelder und eine Befehlsschaltfläche angezeigt. Jedes Eingabefeld enthält einen 33 Zeichen langen Text. Wenn Sie auf "Senden" klicken, wird die Fehlermeldung "Der Text ist zu lang. Es war 33, aber nur 0 Zeichen sind erlaubt." wird für jede Zeile/Feld angezeigt. Das ist falsch, weil "test: testValidator length =" # {testBean.key [k]} "" die Länge auf 0 für die erste Zeile, 1 für die zweite Zeile, 2 für die dritte Zeile und 3 für die vierte Zeile angibt. Für die letzte Zeile sollte die Fehlermeldung also lauten: "Der Text ist zu lang. Er war 33, aber es sind nur 3 Zeichen erlaubt."
Das Problem ist, dass der Validator scheint nicht Zugriff auf die k-Variable aus der DataTable-Komponente in der JSF-Datei. Dies funktionierte in JSF 1.2, aber wir können es nicht in JSF 2.0 zum Laufen bringen. Wir haben jetzt Tage mit dem Problem verbracht und brauchen wirklich Hilfe. Ideen jemand?
Ich fühle mich vielleicht sollte ich das Problem ein bisschen mehr angeben. Es scheint, dass die Länge des Validators mit der Ganzzahl festgelegt wird, die zu Beginn der Anfrage aus dem Ausdruck # {testBean.key [k]} aufgelöst wird, aber später in der Anfrage, wenn die dataTable iteriert, wird der Ausdruck nicht noch einmal aufgelöst Länge neu eingestellt. Da k nur während der dataTables-Iterationen festgelegt wird, bedeutet dies, dass die Länge während der gesamten Anforderung null bleibt. Die perfekte Lösung wäre, wenn der Ausdruck einmal pro Iteration aufgelöst werden könnte, aber ich weiß nicht, wie man dies erzwingt. –
Ich habe diesen Kommentar nicht gesehen, als ich meine Antwort geschrieben habe, aber sehe meine Bemerkungen über 'ValueExpressions'. Sie müssen den Ausdruck im Validator auswerten (Sie können den 'ELContext' aus dem' FacesContext' erhalten). – McDowell