我们正在创建一个配置文件页面,其中包含一个可选择在其上显示配置文件的表单。我们正在使用Spring 3.2
以下是表格: -
<form:form id="editMember" modelAttribute="memberAjaxEditModel"
method="POST" class="form-horizontal" enctype="multipart/form-data" >
...
<form:input path="fileData" type="file"/>
...
</form>
这是控制器方法: -
@RequestMapping(value = "/{id}", method = RequestMethod.POST)
public String onEditPost(@PathVariable long id, @Valid @ModelAttribute(MemberAjaxEditModel.KEY) MemberAjaxEditModel model, BindingResult result) throws ServiceRecoverableException {
....
}
这是模型
public class MemberAjaxEditModel {
...
private CommonsMultipartFile fileData;
...
}
如果在表单上提交文件,它可以正常工作,但如果在没有文件的情况下提交表单,则BindingResult变量中存在错误。
这是错误: -
Field error in object 'memberAjaxEditModel' on field 'fileData': rejected value []; codes [typeMismatch.memberAjaxEditModel.fileData,typeMismatch.fileData,typeMismatch.org.springframework.web.multipart.commons.CommonsMultipartFile,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [memberAjaxEditModel.fileData,fileData]; arguments []; default message [fileData]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.web.multipart.commons.CommonsMultipartFile' for property 'fileData'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [java.lang.String] to required type [org.springframework.web.multipart.commons.CommonsMultipartFile] for property 'fileData': no matching editors or conversion strategy found]
答案 0 :(得分:6)
事实证明是jQuery Form plugin正在发送一个空字符串而不是春天所期望的 - 没有什么可以发送的。
我解决了问题,使用提交前删除fileData值,如果它没有填充如下: -
function beforeSubmit(arr, $form, options){
var fileDataIndex = -1;
$.each(arr, function(index, value) {
if (value.name == "fileData"){
if (value.value.length == 0){
fileDataIndex = index;
}
}
});
if (fileDataIndex != -1){
arr.remove(fileDataIndex);
}
}
我希望这可以帮助一些有同样问题的google。
答案 1 :(得分:2)
您可以使用iframe选项为两种情况强制使用相同类型的帖子:
iframe:true
答案 2 :(得分:2)
尝试使用StringMultipartFileEditor
。
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringMultipartFileEditor());
}
答案 3 :(得分:1)
使用org.springframework.web.multipart.MultipartFile
代替CommonsMultipartFile
答案 4 :(得分:0)
您的multipartResolver
中是否定义了application-context.xml
bean?如果没有,请包含此内容并尝试
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000"/> <!-- File size in bytes. -->
</bean>