web-dev-qa-db-fra.com

h: inputText qui est lié à la propriété String soumet une chaîne vide au lieu de null

J'ai une application JSF 2.0 sur Tomcat comportant de nombreux champs <h:inputText> pour saisir des données dans ma base de données. Certains champs ne sont pas obligatoires.

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

Lorsque l'utilisateur laisse ce champ vide, JSF définit une chaîne vide "" au lieu de null.

Comment puis-je résoudre ce problème sans vérifier chaque chaîne avec

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

Vous pouvez configurer JSF 2.x pour interpréter les valeurs soumises vides comme nulles à l'aide du context-param suivant dans web.xml (qui porte un nom assez long, ce sera également la raison pour laquelle je ne pouvais pas m'en souvenir;)):

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

Pour référence et pour ceux qui sont intéressés, dans JSF 1.2 (et donc pas 1.1 ou plus ancien car il est de par leur conception impossible d'avoir un Converter pour Java.lang.String), ceci est contournable avec le Converter suivant:

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();
    }

}

... qui doit être enregistré dans faces-config.xml comme suit:

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

Si vous n'êtes pas encore sur Java 6, remplacez submittedValue.empty() par submittedValue.length() == 0.

Voir également

49
BalusC

j'espère que c'est la bonne façon de dire que je ne peux pas trouver de solution au problème.

J'ai ajouté le context-param à mon web.xml mais il n'y a aucun résultat. J'utilise un serveur Tomcat 6.0.24 avec ces deux context-param: javax.faces.PROJECT_STAGE = Développement javax.faces.VALIDATE_EMPTY_FIELDS = true

0
ThreeFingerMark