JSF2で空の文字列をnullに変換することに関する投稿がたくさんあることを私は知っています。通常の処方箋は、web.xml に以下を追加することです。
<context-param>
<description>Does not appear to work</description>
<param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
<param-value>true</param-value>
</context-param>
これはまったく機能していないようです。次に、カスタム文字列コンバーターを作成して、それが機能するかどうかをテストしました。inputText へのコンバーターとして明示的に追加しました (それ以外の場合、空白の場合は起動しません)。
INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL が true に設定されている場合、コンバーターは null を受け取り、入力テキストのセッターは引き続き "" を受け取ります。
INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL が false に設定されている (またはコメントアウトされている) 場合、コンバーターは "" を受け取り、入力テキストのセッターは "" を受け取ります (コンバーターが null を返した後でも)。
@FacesConverter(forClass=java.lang.String.class, value="emptyStringToNull")
public class StringConverter implements Converter, Serializable {
private static final long serialVersionUID = -1121162636180944948L;
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.trim().isEmpty()) {
return null;
}
return value;
}
public String getAsString(FacesContext context, UIComponent component, Object object) {
if (object == null)
return null;
return object.toString();
}
}
getAsObject で送信されたコンポーネントの値を明示的に設定しようとしましたが (無駄に)、イベントを実行しました。
if (component instanceof EditableValueHolder)
((EditableValueHolder) component).setSubmittedValue(null);
私は JBoss6 (実際には 6.1 のスナップショット) と JSF 2.1.1 を使用しています。