2

私のプロジェクトでは、h:selectOneMenuを使用してコンボボックスを実装したいと思います。selectOneMenuを適切に処理する方法とカスタムコンバーターを実装する方法についての多くの投稿を読みました。コンボボックスは、制約が設定されている別のDBテーブル(fk_IDという名前)からのID(Long )を格納する必要があります。これまでのところ、すべてが計画どおりに機能しているようです。今私の問題に:

列fk_IDはオプションであるため、コンボボックスの最初のオプションはf:selectItemであり、「choose...」というラベルの付いた値はありません。フォームを保存して値を変更すると、「choose ...」に戻す場合を除いて、すべて問題ありません。私が得るエラーは、制約の整合性違反です。

私も問題を見つけました:コンバーターは意図したとおりにnullを返しますが、BeanはLong0を受け取ります

XHTML:

<h:selectOneMenu value="#{userBean.selectedModel.fk_id}"
    id="combobox">
    <f:selectItem itemLabel="choose ..." />
    <f:selectItems
        value="#{userBean.items}"
        var="item"
        itemLabel="#{item.value}"
        itemValue="#{item.id}"
    />
    <f:converter converterId="userConverter" />
</h:selectOneMenu>

カスタムコンバーター:

@FacesConverter(value = "userConverter")
public class UserConverter implements Converter {
    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
        if (arg2 != null && !arg2.equals("null"))
            return Long.valueOf(arg2);

        return null;
    }
    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
        return String.valueOf(arg2);
    }
}

Bean(非常に短いバージョン):

@Named(value = "userBean")
public class UserController implements Serializable {

    @Getter
    @Setter
    private UserModel selectedModel;

    @Getter
    @Setter
    private List<UserModel> items;

    public void saveModel() {
        selectedModel = userService.saveModel(selectedModel);
    }
}

問題は、fk_idLong 0であるが、 nullである必要があることです。私は書くことによって問題を解決することができます

if (selectedModel.getFk_id() == 0)
    selectedModel.setFk_id(null);

、しかしそれは私が満足している解決策ではありません。

私の質問:コンバーターが返す値nullがsaveModel()メソッド内のLong 0であるのはなぜですか?

4

1 に答える 1

5

このコンバーターは不要であり、意味がありません ( が と の間ではなく と の間でUserConverter変換されることを期待しています)。それを除く。UserStringLongString

次に、送信された空の文字列の値を として解釈するように JSF に指示する必要がありますnull。以下を に追加しますweb.xml

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

これにより、ほとんどのコンテナーの問題が解決するはずです。ただし、Tomcat またはそのフォーク/クローン (JBoss AS、WebSphere AS など) を使用している場合、および/またはコンテナーが Apache EL パーサー実装を使用している場合は、VM の起動引数に次の引数も追加する必要があります。

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

これにより、プリミティブ ラッパー タイプをプロパティとして使用している場合でも、Apache EL パーサーが送信された値をプリミティブのデフォルト値に強制することがなくなります。

以下も参照してください。


具体的な問題とは関係ありませんが、コンボボックスはありません。これは単なるドロップダウンリストです。コンボボックスは、編集可能なドロップダウン リストです。条件を正しく理解してください ;)

于 2011-11-11T12:39:05.537 に答える