Я разрабатываю службу RESTful на основе Spring 3.2. Я столкнулся с проблемой с контроллером, обрабатывающим смешанный многостраничный HTTP-запрос, со второй частью с форматированными данными XMLor JSON и второй частью с файлом изображения.
Я использую @RequestPart аннотацию для получения запроса
@RequestMapping(value = "/User/Image", method = RequestMethod.POST, consumes = {"multipart/mixed"},produces="applcation/json")
public
ResponseEntity<List<Map<String, String>>> createUser(
@RequestPart("file") MultipartFile file, @RequestPart(required=false) User user) {
System.out.println("file" + file);
System.out.println("user " + user);
System.out.println("received file with original filename: "
+ file.getOriginalFilename());
// List<MultipartFile> files = uploadForm.getFiles();
List<Map<String, String>> response = new ArrayList<Map<String, String>>();
Map<String, String> responseMap = new HashMap<String, String>();
List<String> fileNames = new ArrayList<String>();
if (null != file) {
// for (MultipartFile multipartFile : files) {
String fileName = file.getOriginalFilename();
fileNames.add(fileName);
try {
file.transferTo(new File("C:/" + file.getOriginalFilename()));
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
responseMap.put("displayText", file.getOriginalFilename());
responseMap.put("fileSize", "" + file.getSize());
response.add(responseMap);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Accept", "application/json");
return new ResponseEntity<List<Map<String, String>>>(response,
httpHeaders, HttpStatus.OK);
}
User.java будет выглядеть следующим образом:
@XmlRootElement(name = "User")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
private int userId;
private String name;
private String email;
private String company;
private String gender;
//getter setter of the data members
}
Насколько я понимаю, используя аннотацию @RequestPart, я ожидал бы, что секция многопрофильного XML будет оцениваться в зависимости от ее Content-Type и, наконец, un-marshalled в мой класс User (я использую Jaxb2, marshaller/unmarhaller правильно настроенный в контексте приложения, и процедура работает нормально для всех других методов контроллера, когда я передаю данные XML как тело и использую аннотацию @RequestBody).
Но то, что на самом деле происходит, состоит в том, что, хотя файл правильно найден и проанализирован как MultipartFile, "пользовательская" часть никогда не видна, и запрос всегда терпит неудачу, а не соответствует сигнатуре метода контроллера.
Я воспроизвел проблему с несколькими типами клиентов, и я уверен, что формат многостраничного запроса в порядке.
Пожалуйста, помогите мне решить эту проблему. Возможно, какое-то обходное решение будет доступно для получения смешанного/многопрофильного запроса.
Спасибо и с уважением,
Рагвендра