Spring 表单无法匹配集合。 ResponseStatusExceptionResolver ....类型不匹配
Spring form cannot match collection. ResponseStatusExceptionResolver ....typeMismatch
我关注class:
public class TerminalAdmin {
....
private Set<AdminRole> adminRoles;
}
还有这个:
public class AdminRole {
....
private Long adminId;
private String role;
}
控制器:
model.addAttribute("adminRoles",terminalAdminService.findAllAdminRoles());
model.addAttribute("newAdmin",new TerminalAdmin());
return "admin/adminUsers";
jsp:
<form:form modelAttribute="newAdmin" action="/admin/addNewAdmin">
<div class="line">
<label for="">role</label>
<form:checkboxes items="${adminRoles}" path="adminRoles"/>
<div class="clear"></div>
</div>
<div class="line">
<input class="btn" type="submit" value="save"/>
<div class="clear"></div>
</div>
</form:form>
当我提交 foem 时,我看到消息:
HTTP Status 400 -
type Status report
message
description The request sent by the client was syntactically incorrect.
Spring 日志:
Field error in object 'terminalAdmin' on field 'adminRoles': rejected value [ROLE_IMAGE_MODERATOR]; codes [typeMismatch.terminalAdmin.adminRoles,typeMismatch.adminRoles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [terminalAdmin.adminRoles,adminRoles]; arguments []; default message [adminRoles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'adminRoles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.terminal.domain.admin.AdminRole] for property 'adminRoles[0]': no matching editors or conversion strategy found]
DEBUG: org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public java.lang.String com.terminal.controller.admin.AdminController.adminUsers(com.terminal.domain.admin.TerminalAdmin)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'terminalAdmin' on field 'adminRoles': rejected value [ROLE_IMAGE_MODERATOR]; codes [typeMismatch.terminalAdmin.adminRoles,typeMismatch.adminRoles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [terminalAdmin.adminRoles,adminRoles]; arguments []; default message [adminRoles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'adminRoles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.terminal.domain.admin.AdminRole] for property 'adminRoles[0]': no matching editors or conversion strategy found]
DEBUG: org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public java.lang.String com.terminal.controller.admin.AdminController.adminUsers(com.terminal.domain.admin.TerminalAdmin)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'terminalAdmin' on field 'adminRoles': rejected value [ROLE_IMAGE_MODERATOR]; codes [typeMismatch.terminalAdmin.adminRoles,typeMismatch.adminRoles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [terminalAdmin.adminRoles,adminRoles]; arguments []; default message [adminRoles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'adminRoles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.terminal.domain.admin.AdminRole] for property 'adminRoles[0]': no matching editors or conversion strategy found]
如何重写代码以避免以下错误?
您收到的错误消息很明确:您必须设置一个 属性 编辑器或转换服务,让活页夹知道如何从字符串中创建 AdminRole 对象(这是您实际拥有的每个复选框)。
如果您检查 jsp 页面源代码,您可能会看到该复选框表示为一个字符串数组(事实上,您会看到与该复选框相同的字段名称条目大小)。当您 post 表单时,活页夹会尝试创建一个 AdminRoles 集合,但如果不存在适当的转换策略,它所能做的最好的事情就是从数组中创建一个字符串集合。
我使用以下代码解决了问题:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(AdminRole.class, new PropertyEditorSupport() {
public void setAsText(String name) {
AdminRole adminRole = terminalAdminService.findRoleByName(name);
setValue(adminRole);
}
});
}
我关注class:
public class TerminalAdmin {
....
private Set<AdminRole> adminRoles;
}
还有这个:
public class AdminRole {
....
private Long adminId;
private String role;
}
控制器:
model.addAttribute("adminRoles",terminalAdminService.findAllAdminRoles());
model.addAttribute("newAdmin",new TerminalAdmin());
return "admin/adminUsers";
jsp:
<form:form modelAttribute="newAdmin" action="/admin/addNewAdmin">
<div class="line">
<label for="">role</label>
<form:checkboxes items="${adminRoles}" path="adminRoles"/>
<div class="clear"></div>
</div>
<div class="line">
<input class="btn" type="submit" value="save"/>
<div class="clear"></div>
</div>
</form:form>
当我提交 foem 时,我看到消息:
HTTP Status 400 -
type Status report
message
description The request sent by the client was syntactically incorrect.
Spring 日志:
Field error in object 'terminalAdmin' on field 'adminRoles': rejected value [ROLE_IMAGE_MODERATOR]; codes [typeMismatch.terminalAdmin.adminRoles,typeMismatch.adminRoles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [terminalAdmin.adminRoles,adminRoles]; arguments []; default message [adminRoles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'adminRoles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.terminal.domain.admin.AdminRole] for property 'adminRoles[0]': no matching editors or conversion strategy found]
DEBUG: org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver - Resolving exception from handler [public java.lang.String com.terminal.controller.admin.AdminController.adminUsers(com.terminal.domain.admin.TerminalAdmin)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'terminalAdmin' on field 'adminRoles': rejected value [ROLE_IMAGE_MODERATOR]; codes [typeMismatch.terminalAdmin.adminRoles,typeMismatch.adminRoles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [terminalAdmin.adminRoles,adminRoles]; arguments []; default message [adminRoles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'adminRoles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.terminal.domain.admin.AdminRole] for property 'adminRoles[0]': no matching editors or conversion strategy found]
DEBUG: org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver - Resolving exception from handler [public java.lang.String com.terminal.controller.admin.AdminController.adminUsers(com.terminal.domain.admin.TerminalAdmin)]: org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'terminalAdmin' on field 'adminRoles': rejected value [ROLE_IMAGE_MODERATOR]; codes [typeMismatch.terminalAdmin.adminRoles,typeMismatch.adminRoles,typeMismatch.java.util.Set,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [terminalAdmin.adminRoles,adminRoles]; arguments []; default message [adminRoles]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Set' for property 'adminRoles'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [com.terminal.domain.admin.AdminRole] for property 'adminRoles[0]': no matching editors or conversion strategy found]
如何重写代码以避免以下错误?
您收到的错误消息很明确:您必须设置一个 属性 编辑器或转换服务,让活页夹知道如何从字符串中创建 AdminRole 对象(这是您实际拥有的每个复选框)。
如果您检查 jsp 页面源代码,您可能会看到该复选框表示为一个字符串数组(事实上,您会看到与该复选框相同的字段名称条目大小)。当您 post 表单时,活页夹会尝试创建一个 AdminRoles 集合,但如果不存在适当的转换策略,它所能做的最好的事情就是从数组中创建一个字符串集合。
我使用以下代码解决了问题:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(AdminRole.class, new PropertyEditorSupport() {
public void setAsText(String name) {
AdminRole adminRole = terminalAdminService.findRoleByName(name);
setValue(adminRole);
}
});
}