如何在控制器中实现正确的数据绑定?

时间:2014-03-12 18:18:14

标签: java spring-mvc data-binding

我有一个jsp页面,它结合使用表单的User对象。在最后一个表格中,我试图获得Collection<Permission>。但是当我试图将数据传递给控制器​​时,由于以下原因导致400错误:

Field error in object 'user' on field 'permissions':
rejected value [add,view];
codes [typeMismatch.user.permissions,typeMismatch.permissions,typeMismatch.java.util.Collection,typeMismatch];
arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.permissions,permissions];
arguments [];
default message [permissions]];
default message [Failed to convert property value of type 'java.lang.String[]' to required type 'java.util.Collection' for property 'permissions'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [it.marco.javaproject.domain.Permission] for property 'permissions[0]': no matching editors or conversion strategy found]

这是我的jsp表单:

<form:form action="/user/permission" method="POST" modelAttribute="user">
   <form:checkboxes path="permissions" items="${permissions}" delimiter=<br>"/>
   <form:hidden path="email"/>
   <form:hidden path="password"/>
   <form:hidden path="name"/>
   <input type="submit" value="Next" name="next"/>
</form:form>

控制器的一部分:

public String processRoleForm(@ModelAttribute("user") User user, ModelMap model) {
    model.addAttribute("permissions", userService.getPermissions());
    return "user/form/permissionForm";
}

许可类:

@Entity
@Table(name = "permission")
public class Permission implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    @Column(name = "name")
    private String name;

如果我没弄错,我需要在控制器中使用某种数据绑定器。怎么实现呢?如何正确地将String []转换为权限集合?

1 个答案:

答案 0 :(得分:1)

我找到了简单的解决方案。这是:

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Permission.class, new PropertyEditorSupport() {
        @Override
        public void setAsText(String id) throws IllegalArgumentException {
            setValue(userService.getPermission(Integer.parseInt(id)));
        }
    });
}