Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

h:inputText which is bound to String property is submitting empty string instead of null

Tags:

I have a JSF 2.0 application on Tomcat with many <h:inputText> fields to input data in my database. Some fields are not required.

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

When the user leave this field empty JSF sets empty string "" instead of null.

How can I fix this behavior without checking every String with

if (string.equals("")) { string = null; } 
like image 601
ThreeFingerMark Avatar asked Feb 04 '10 21:02

ThreeFingerMark


1 Answers

You can configure JSF 2.x to interpret empty submitted values as null by the following context-param in web.xml (which has a pretty long name, that'll also be why I couldn't recall it ;) ):

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

For reference and for ones who are interested, in JSF 1.2 (and thus not 1.1 or older because it's by design not possible to have a Converter for java.lang.String) this is workaroundable with the following 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();     }  } 

...which needs to be registered in faces-config.xml as follows:

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

In case you're not on Java 6 yet, replace submittedValue.empty() by submittedValue.length() == 0.

See also

  • The empty String madness
like image 130
BalusC Avatar answered Sep 26 '22 01:09

BalusC