无法将类型 'org.springframework.web.multipart.commons.CommonsMultipartFile' 的值转换为所需类型
Failed to convert value of type 'org.springframework.web.multipart.commons.CommonsMultipartFile' to required type
我有以下控制器方法:
@RequestMapping(value = "/owner/terminals/save", method = RequestMethod.POST)
public String saveTerminal( @RequestParam(value = "name") String name,
@RequestParam(value = "file") @Valid OnlyForImagesFileWrapper file,
BindingResult bindingResult )
{
...
我看到以下堆栈跟踪:
org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'org.springframework.web.multipart.commons.CommonsMultipartFile' to required type 'com.terminal.domain.validation.OnlyForImagesFileWrapper'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.springframework.web.multipart.commons.CommonsMultipartFile] to required type [com.terminal.domain.validation.OnlyForImagesFileWrapper]: no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:74)
....
Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.springframework.web.multipart.commons.CommonsMultipartFile] to required type [com.terminal.domain.validation.OnlyForImagesFileWrapper]: no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:267)
... 71 more
OnlyForImagesFileWrapper 来源:
public class OnlyForImagesFileWrapper {
@Extensions(imageFormats = {".jpg",".png",".gif",".bmp"}, videoFormats = {})
private MultipartFile multipartFile;
...
}
如何避免这个问题?
我在哪里可以为多部分文件的这种控制器方法设置转换策略?
P.S.
我尝试编写我的自定义 initbinder:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(CommonsMultipartFile.class, new PropertyEditorSupport() {
@Override
public void setValue(Object file) {
setValue(new OnlyForImagesFileWrapper((MultipartFile) file));
}
});
}
但是当我提交表单并且我看到上面提到的堆栈跟踪时,这个方法没有被调用。
P.S.
M 后的结果。 Deinum 指令执行(当我在 saveTerminal
方法中时):
我还注意到我的 initbinder 方法没有调用。
关于我的代码的更多细节(M.Denium 建议后的状态):
jsp:
<input type="file" id="newFile" name="file" class="file" size="21.5" accept=".jpg,.png,.gif,.bmp" style="opacity: 0;">
控制器方法的参数:
...
@ModelAttribute @Valid OnlyForImagesFileWrapper wrapper,
BindingResult bindingResult,
...
正如我所说,你把事情搞得太复杂了。将包装器更改为以下内容(使用适当的 getter 和 setter)。
public class OnlyForImagesFileWrapper {
@Extensions(imageFormats = {".jpg",".png",".gif",".bmp"}, videoFormats = {})
private MultipartFile file;
private String name;
...
}
然后是你的控制器方法
@RequestMapping(value = "/owner/terminals/save", method = RequestMethod.POST)
public String saveTerminal( @ModelAttribute @Valid OnlyForImagesFileWrapper wrapper, BindingResult bindingResult ) { ... }
当然,在您的配置中,请确保您的 MultipartFileResolver
配置为正确处理 MultipartFile
参数,如 the reference guide 中所述。
我有以下控制器方法:
@RequestMapping(value = "/owner/terminals/save", method = RequestMethod.POST)
public String saveTerminal( @RequestParam(value = "name") String name,
@RequestParam(value = "file") @Valid OnlyForImagesFileWrapper file,
BindingResult bindingResult )
{
...
我看到以下堆栈跟踪:
org.springframework.beans.ConversionNotSupportedException: Failed to convert value of type 'org.springframework.web.multipart.commons.CommonsMultipartFile' to required type 'com.terminal.domain.validation.OnlyForImagesFileWrapper'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.springframework.web.multipart.commons.CommonsMultipartFile] to required type [com.terminal.domain.validation.OnlyForImagesFileWrapper]: no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterSupport.doConvert(TypeConverterSupport.java:74)
....
Caused by: java.lang.IllegalStateException: Cannot convert value of type [org.springframework.web.multipart.commons.CommonsMultipartFile] to required type [com.terminal.domain.validation.OnlyForImagesFileWrapper]: no matching editors or conversion strategy found
at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:267)
... 71 more
OnlyForImagesFileWrapper 来源:
public class OnlyForImagesFileWrapper {
@Extensions(imageFormats = {".jpg",".png",".gif",".bmp"}, videoFormats = {})
private MultipartFile multipartFile;
...
}
如何避免这个问题?
我在哪里可以为多部分文件的这种控制器方法设置转换策略?
P.S.
我尝试编写我的自定义 initbinder:
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(CommonsMultipartFile.class, new PropertyEditorSupport() {
@Override
public void setValue(Object file) {
setValue(new OnlyForImagesFileWrapper((MultipartFile) file));
}
});
}
但是当我提交表单并且我看到上面提到的堆栈跟踪时,这个方法没有被调用。
P.S.
M 后的结果。 Deinum 指令执行(当我在 saveTerminal
方法中时):
我还注意到我的 initbinder 方法没有调用。
关于我的代码的更多细节(M.Denium 建议后的状态):
jsp:
<input type="file" id="newFile" name="file" class="file" size="21.5" accept=".jpg,.png,.gif,.bmp" style="opacity: 0;">
控制器方法的参数:
...
@ModelAttribute @Valid OnlyForImagesFileWrapper wrapper,
BindingResult bindingResult,
...
正如我所说,你把事情搞得太复杂了。将包装器更改为以下内容(使用适当的 getter 和 setter)。
public class OnlyForImagesFileWrapper {
@Extensions(imageFormats = {".jpg",".png",".gif",".bmp"}, videoFormats = {})
private MultipartFile file;
private String name;
...
}
然后是你的控制器方法
@RequestMapping(value = "/owner/terminals/save", method = RequestMethod.POST)
public String saveTerminal( @ModelAttribute @Valid OnlyForImagesFileWrapper wrapper, BindingResult bindingResult ) { ... }
当然,在您的配置中,请确保您的 MultipartFileResolver
配置为正确处理 MultipartFile
参数,如 the reference guide 中所述。