2015-05-02 18 views
2

я следующий метод контроллера:Не удалось преобразовать значение типа «org.springframework.web.multipart.commons.CommonsMultipartFile» для требуемого типа

@RequestMapping(value = "/owner/terminals/save", method = RequestMethod.POST) 
public String saveTerminal(@RequestParam(value = "name") String name, 
          @RequestParam(value = "file") @Valid OnlyForImagesFileWrapper file, 
           BindingResult bindingResult) 
      { 
       ... 

и вижу следующее: StackTrace

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)); 
      } 
     }); 
    } 

Но этот метод не вызывается, когда я отправить форму, и я вижу StackTrace упоминался выше.

P.S.

результат после М. Deinum исполнения команд (когда я внутри saveTerminal метод):

http://dl2.joxi.net/drive/0005/3037/338909/150502/e592df25e4.jpg

Кроме того, я заметил, что мой метод initbinder не вызывает.

Более подробно о моем коде (состояние после консультации М. 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, 
... 
+0

Вы прочитали [справочное руководство] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-multipart) ... Также, если вы захотите привязать, затем используйте привязку. Добавьте свойство 'name' типа' String' и переименуйте 'multipartFile' в' файл'. Удалите '@ RequestParam' из метода и просто аннотируйте аргумент метода, напечатанный' OnlyForImagesFileWrapper', с помощью '@ ModelAttribute'. Вы смешиваете и смешиваете много вещей, и с этим многое делает сложнее, чем нужно. –

+0

@M. Deinum в справочном quid написано, как я могу принять MultipartFile как атрибут метода. В моем случае я хочу принять обертку поверх MultipartFile – gstackoverflow

+0

@M.Deinum ** Добавить имя свойства типа String и переименовать multipartFile в файл ** где? – gstackoverflow

ответ

2

Как я заметил, вы делаете вещи слишком сложным. Измените свою обертку на следующую (с соответствующими геттерами и сеттерами).

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.

+0

После выполнения ваших инструкций saveTerminal всегда принимает нулевой аргумент http://dl2.joxi.net/drive/0005/3037/338909/150502/e592df25e4.jpg – gstackoverflow

+0

Я обновил тему – gstackoverflow

+0

Вы еще не сделали то, что я вам сказал , Вы не переименовали свой атрибут из 'multipartFile' в' файл'. Также вы должны удалить свой метод связывания с init, поскольку он ничего не делает. –