web-dev-qa-db-de.com

h: inputText, das an die String-Eigenschaft gebunden ist, übergibt anstelle von null einen leeren String

Ich habe eine JSF 2.0-Anwendung auf Tomcat mit vielen <h:inputText> -Feldern, um Daten in meine Datenbank einzugeben. Einige Felder sind nicht erforderlich.

<h:inputText value="#{registerBean.user.phoneNumber}" id="phoneNumber">
    <f:validateLength maximum="20" />
</h:inputText>

Wenn der Benutzer dieses Feld leer lässt, setzt JSF die leere Zeichenfolge "" anstelle von null.

Wie kann ich dieses Verhalten beheben, ohne jeden String mit zu überprüfen?

if (string.equals("")) { string = null; }
19
ThreeFingerMark

Sie können JSF 2.x so konfigurieren, dass leere übermittelte Werte durch den folgenden context-param in web.xml als null interpretiert werden (der einen ziemlich langen Namen hat, aus diesem Grund konnte ich ihn auch nicht zurückrufen;)):

<context-param>
    <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
    <param-value>true</param-value>
</context-param>

Zu Referenzzwecken und für diejenigen, die an JSF 1.2 interessiert sind (und daher nicht 1.1 oder älter, da es von vornherein nicht möglich ist, eine Converter für Java.lang.String zu haben), ist dies eine Problemumgehung mit der folgenden Converter:

public class EmptyToNullStringConverter implements Converter {

    public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {
        if (submittedValue == null || submittedValue.isEmpty()) {
            if (component instanceof EditableValueHolder) {
                ((EditableValueHolder) component).setSubmittedValue(null);
            }

            return null;
        }

        return submittedValue;
    }

    public String getAsString(FacesContext facesContext, UIComponent component, Object modelValue) {
        return (modelValue == null) ? "" : modelValue.toString();
    }

}

... die wie folgt in faces-config.xml registriert werden muss:

<converter>
    <converter-for-class>Java.lang.String</converter-for-class>
    <converter-class>com.example.EmptyToNullStringConverter</converter-class>
</converter>

Falls Sie noch nicht mit Java 6 arbeiten, ersetzen Sie submittedValue.empty() durch submittedValue.length() == 0.

Siehe auch

49
BalusC

ich hoffe, das ist der richtige Weg zu sagen, dass ich keine Lösung für das Problem finden kann.

Ich habe den context-param zu meinem web.xml hinzugefügt, aber er hat kein Ergebnis. Ich verwende einen Tomcat 6.0.24-Server mit diesen beiden context-param: javax.faces.PROJECT_STAGE = Entwicklungs-javax.faces.VALIDATE_EMPTY_FIELDS = true

0
ThreeFingerMark