22

Spring MVC の SimpleFormController を Spring MVC のフォーム JTL と組み合わせて使用​​し、汎用オブジェクトを編集するフォームを作成しています。

私のフォームには、ユーザーがドロップダウンを介してサーバーを指定できるドロップダウンがあります。

<form:form commandName="generic">
    <form:select path="server">
        <form:options items="${servers}" itemValue="id" itemLabel="name"/>
    </form:select>
</form:form>

ここでのサーバーは、利用可能なすべてのサーバーのデータベース呼び出しによって伝播されます。server はサーバー ORM pojo です。これは、フォーム バッキング オブジェクトとして機能する別の ORM pojo (ジェネリック) のサブオブジェクトです。

ここでの私の目標は、データベース レベルでサーバー テーブルへの外部キーとして表される Generic のサーバー参照を変更することです。

JPA を永続化レイヤーとして使用し、JPA によって生成されたエンティティ クラスを ORM pojo として使用しています。

残念ながら、文字列からサーバーに変換できないため、フォームの送信時にこれが適切にバインドされていないようです。

Field error in object 'generic' on field 'server': rejected value [1]; codes [typeMismatch.generic.server,typeMismatch.server,typeMismatch.com.generic.orm.jpa.Server,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [generic.server,server]; arguments []; default message [server]]; default message [Failed to convert property value of type [java.lang.String] to required type [com.generic.orm.jpa.Server] for property 'server'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [java.lang.String] to required type [com.generic.orm.jpa.Server] for property 'server': no matching editors or conversion strategy found], generic=com.generic.orm.jpa.generic[id=3]} and static attributes {}

私は運が悪くてもこれを達成する方法の例を探していました。この質問で行ったように、SimpleFormController 内で何かを上書きする必要があると思いますが、Spring MVC のドキュメントでは詳細が軽視されています。誰か助けてくれませんか?

4

5 に答える 5

21

マークの答えの補足として、コントローラーで最終的に行ったことを次に示します。

@Override
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception {
    binder.registerCustomEditor(Server.class, "serverId", new PropertyEditorSupport() {
        @Override
        public void setAsText(String text) {
            Server type = (Server) em.createNamedQuery("Server.findById")
                .setParameter("id", Short.parseShort(text)).getSingleResult();
            setValue(type);
        }
    });
}

匿名クラスではなく、Spring インジェクションを使用してこれを行うこともできます。これは、マークの回答のリンクで概説されています。

PropertyEditorSupport の代わりに ClassEditor (以下を参照) を拡張することもできます。Javadoc には次のように記載されています。

java.lang.Class のプロパティ エディタ。ブリッジとして String クラス名プロパティを使用する必要なく、Class プロパティを直接設定できます。

この利点を完全に理解しているかどうかはわかりませんが、心に留めておくべきことがあります。

便利な Javadoc

于 2009-05-28T16:08:31.923 に答える
18

「server.id」を使用すると、可能な解決策になる可能性があります。したがって、スプリングは選択した値を自動的にバインドします。その逆も同様です。

<form:form commandName="generic">
    <form:select path="server.id">
        <form:options items="${servers}" itemValue="id" itemLabel="name"/>
    </form:select>
</form:form>
于 2012-04-20T05:47:02.330 に答える
5

私はあなたが正しいと思います。String を Server インスタンスに変換できるように、以前に行ったようにバインダーにカスタム エディターを登録する必要があります。カスタム PropertyEditor の例は、ここの Spring リファレンス ドキュメントにあり、ここから始める必要があります。

MVC のドキュメントが最善ではないことに同意します。私はSpringフォーラムで多くのグーグルと検索をしなければなりませんでした。

于 2009-05-26T20:55:11.203 に答える