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 类中成员属性的定义如下。组类也被 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
...

当内容绑定到隐藏字段时,它被连接到逗号分隔,然后当它再次被拆分为 arraylist 条目时,当然每个条目被分成四个单独的条目。

我尝试为 ArrayList 使用自定义转换器,但它搞砸了一些其他的东西,比如为语言环境加载资源消息。

你有什么建议如何以任何不丑陋的方式处理它 - 这样我就不必包装我的 DAO 类或修改它们。

谢谢,

/雅库布

4

3 回答 3

1

在你的members元素上有一个小的包装类型,比如:

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

现在,您可以提供一个自定义转换器来将此 MembersWrapper 实例转换为 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 回答