2014-03-12 25 views
2

我有一個結合用戶對象使用表單的jsp頁面。在最後一張表格中,我試圖獲得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

我找到了簡單的解決方案。那就是:

@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))); 
     } 
    }); 
} 
+0

這將是我的首選方式,但你可以通過索引他們像'PATH =「權限[0] .value的」'還引用的每個'permission'獨立。但是,這樣做意味着您需要在後端執行大量清理以「清理」未檢查的項目。我會說你最好是寫一個適當的綁定,讓它以這種方式處理,所以你可以得到一個完整的列表,而不必做清理。 – CodeChimp

相關問題