JsonMappingException: не может создать экземпляр CommonsMultipartFile

1

Я использую Spring-MVC 3, и в своем приложении я отправляю некоторую информацию с несколькими вложениями, и каждый из этих файлов имеет один заголовок, идентификатор и т.д. Итак, я сделал один DTO следующим образом

public class MyDTO {

Long id;

Integer age;

MultipartFile infoFile;

// getter setter

Я просто создаю один объект JSON соответствии с указанным выше классом DTO в моем JS файле.

Вот мое отображение Controller:

@RequestMapping(value = "/saveInfo", method = RequestMethod.POST)
public @ResponseBody String saveInfo(
       @RequestParam(value = "data", required = true) String stdData,
       @RequestParam(value = "fileData", required = false) MultipartFile[] files,
       HttpSession session,HttpServletRequest request) {

       MyDTO dto;
       try {
                dto = mapper.readValue(stdData, new TypeReference<MyDTO>() {});  
        } catch (JsonParseException e) {
                e.printStackTrace();
        } catch (JsonMappingException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace();
        }

Но я получаю следующие ошибки:

org.codehaus.jackson.map.JsonMappingException: Can not construct instance of    org.springframework.web.multipart.commons.CommonsMultipartFile, 
problem: no suitable creator method found to deserialize from JSON String
at [Source: java.io.StringReader@19747c9; line: 1, column: 336] (through reference chain: com.avi.dto.MyDTO["hbvFile"])
  • 0
    Вероятно, ему нужен конструктор без аргументов, а у CommonsMultipartFile его нет.
  • 0
    Не могли бы вы показать, как выглядит ваш JSON ?
Теги:
spring-mvc
jackson
multipart

1 ответ

3
Лучший ответ

На самом деле я нахожу ответ для себя. Мы не можем отправить файл непосредственно в объект JSON. Объект File не содержит файл, он содержит путь к файлу, т.е. C: /hi.txt. Если это то, что мы вкладываем в наш JSON, оно будет производить

{"File": "C: /hi.txt"}

Он не будет содержать содержимое файла. Таким образом, мы могли бы просто поставить путь к файлу напрямую

JSONObject my_data = new JSONObject();
my_data.put("User", "Avi");
my_data.put("Date", "22-07-2013");
my_data.put("File", "C:/hi.txt");

Если вы пытаетесь загрузить файл с помощью JSON, один из способов - прочитать байты из файла с помощью Java 7 NIO

byte[] bytes = Files.readAllBytes(file_upload .toPath());

Base64 кодирует эти байты и записывает их как String в JSONObject. Использование кодека Apache Commons

Base64.encodeBase64(bytes);
my_data.put("File", new String(bytes));

Существует 94 Unicode которые могут быть представлены в виде одного байта в соответствии со спецификацией JSON (если ваш JSON передается как UTF-8).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню