0

グループ編集フォームがあります:

            <form:form method="POST" action="" commandName="group">
            <table>         
                <tr>
                    <td><form:label path="name">Name</form:label></td>
                    <td><form:input path="name" disabled="disabled" /></td>
                    <td><form:errors path="name" class="error" /></td>
                </tr>
                <tr>
                    <td><form:label path="description">Description</form:label></td>
                    <td><form:input path="description" /></td>
                    <td><form:errors path="description" class="error" /></td>
                </tr>
                <tr>
                    <td><form:label path="gidNumber">GID</form:label></td>
                    <td><form:input path="gidNumber" /></td>
                    <td><form:errors path="gidNumber" class="error" /></td>
                </tr>
                <tr>
                    <td colspan="3"><input type="submit" /></td>
                </tr>       
            </table>
            <form:hidden path="members" />
        </form:form>

このフォームは、クラス Group のバインディング オブジェクトです。問題は、メンバー属性を隠しフィールドにバインドすることです。Group クラスの member 属性の定義は以下のとおりです。グループ クラスは、Spring LDAP ODM マネージャーによっても使用されています (したがって、そこに注釈があります)。

@Attribute(name="member", syntax="1.3.6.1.4.1.1466.115.121.1.12")
private List<String> members = new ArrayList<String>();

通常、この配列リストの内容は次のようになります。

1: uid=user1,ou=users,dc=example,dc=com
2: uid=lilcuttie2,ou=users,dc=example,dc=com
3: uid=naprostejmagor,ou=users,dc=example,dc=com
4: uid=crazyuser,ou=users,dc=brazzers,dc=com
...

コンテンツが非表示フィールドにバインドされると、コンマ区切りに連結されます。その後、配列リスト エントリに再び分割されると、もちろん各エントリは 4 つの個別のエントリに分割されます。

ArrayList にカスタム コンバーターを使用しようとしましたが、ロケールのリソース メッセージの読み込みなど、他の処理が台無しになりました。

DAOクラスをラップしたり変更したりする必要がないように、醜くない方法でそれを処理する方法について何か提案はありますか。

ありがとう、

/ヤクブ

4

3 に答える 3

1

あなたのmembers要素の上に小さなラッパータイプを持ってください:

public class MembersWrapper{
    private List<String> members;
.....
}

これで、カスタム コンバーターを提供して、この MemberWrapper インスタンスを String に変換したり、その逆に変換したりできます。変換は、リストの各要素をコロンで区切ったものにすることができ、後で解析することができます。

public class MemberWrapperToStringConverter implements Converter<MemberWrapper, String>{
...
}

public class StringToMemberWrapperConverter implements Converter<String, MemberWrapper>{
....
}

これらのコンバーターを Spring MVC に登録します。

<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="..MemberWrapperToStringConverter "/>
            <bean class="..StringToMemberWrapperConverter "/>
        </set>
    </property>
</bean>

別の方法として、@InitBinder アノテーションを介してカスタム プロパティ エディターを提供します。

 @InitBinder
public void initBinder(WebDataBinder binder){
    binder.registerCustomEditor(Wrapper.class, new PropertyEditorSupport(){
        @Override public String getAsText() {
            //....
        }

        @Override public void setAsText(String text) throws IllegalArgumentException {
            //....
        }
    });
}

これらのコンバーターのロジックは単純で、リストを何らかの文字列形式に変換して、簡単に解析してリストに戻すことができます。たとえば、リスト要素の間にコロンまたはセミコロンを追加するだけです。

于 2012-05-18T10:46:37.003 に答える
0

私はあなたの問題について明確ではないので、いくつかの仮定を立て、それに基づいてこの回答を提供しました.

まあ、あなたは使うことができますメンバーリスト内のエントリをループし、リスト内のエントリごとに個別の非表示フィールドを作成できます。

これがお役に立てば幸いです。

乾杯。

于 2012-05-18T08:57:59.070 に答える
0

使用している場合、非表示フィールドにフォームタグを配置する必要はありません隠しフィールドには単純な入力タグを使用するだけですが、 name プロパティでは次のように指定する必要があります。

<input type="hidden" name="members${status.index}"/>

このようにして、同じ値をコントローラーにバインドします。

これはあなたを助けるはずだと思います。

乾杯。

于 2012-05-18T10:56:46.320 に答える