11

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 を使用しています。

4

1 に答える 1

21

これは Mojarra 固有のものではありません。これは Tomcat 固有のものです (JBoss は Tomcat をサーブレットコンテナとして使用します)。次の VM 引数を起動オプションに追加します。

-Dorg.apache.el.parser.COERCE_TO_ZERO=false

私の経験では、これは実際にはプロパティ (int、long など) にのみ適用する必要がありますがNumber、Tomcat 6.0.x の特定の後期バージョン (少なくとも 6.0.20 以降) では、文字列に対しても壊れているようで、上記の VM 引数に依存します。

たとえば、GlassFish 3.x では、そのままで問題なく動作します。

于 2011-06-10T12:08:07.550 に答える