2013-04-26 13 views
8

Sto sviluppando un servizio RESTful basato su Spring 3.2. Sto affrontando un problema con un controller che gestisce la richiesta HTTP multipart mista, con una seconda parte con dati formattati XMLor JSON e una seconda parte con un file immagine.@RequestPart con richiesta mista multipart, Spring MVC 3.2

Sto usando @RequestPart annotation per la ricezione della richiesta

@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 sarà come questo-

@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 
} 

Per la mia comprensione, usando l'annotazione @RequestPart mi aspetterei la sezione multipart XML da valutare in base al suo Content-Type e infine non-marshalling nella mia User class (sto usando Jaxb2, il marshaller/unmarhaller è configurato correttamente nel contesto dell'applicazione e la procedura sta funzionando bene per tutti gli altri metho del controller ds quando passo i dati XML come corpo e utilizzo l'annotazione @RequestBody).

Ma ciò che è realmente accadendo è che, anche se il file è correttamente trovato e analizzato come MultipartFile, la parte "utente" non si vede mai e la richiesta è sempre meno, non corrispondenti la firma del metodo di controllo.

Ho riprodotto il problema con diversi tipi di client e sono fiducioso che il formato della richiesta multipart sia ok.

Please help me per risolvere questo problema, Forse qualche soluzione sarà lì per ricevere la richiesta mista/multipart.

Grazie e saluti,

Raghvendra

+0

Hai mai provato con 'consuma = {" multipart/form- dati "}'? –

risposta

-2

Hai provato

ResponseEntity<List<Map<String, String>>> createUser(
     @RequestPart("file") MultipartFile file, @RequestBody(required=false) User user) { 

o

ResponseEntity<List<Map<String, String>>> createUser(
     @RequestPart("file") MultipartFile file, @RequestParam(required=false) User user) { 

Se questo non funziona si può mostrarci mapping.xml

6

Non sono sicuro se avessi risolto il tuo problema, ma ho anche avuto un problema simile a quello in cui il mio controller non ha rilevato il mio oggetto JSON quando ho mixato @RequestPart e MultipartFile insieme.

la firma del metodo per la vostra chiamata è corretto:

public ResponseEntity<List<Map<String, String>>> createUser(
     @RequestPart("file") MultipartFile file, @RequestPart(required=false) User user) { 

// ... CODE ... 
} 

Tuttavia assicurarsi che la vostra richiesta simile a questa:

POST /createUser 
Content-Type: multipart/mixed; boundary=B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E 

--B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E 
Content-Disposition: form-data; name="user"; 
Content-Type: application/xml; charset=UTF-8 

<user><!-- your user xml --></user> 
--B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E 
Content-Disposition: form-data; name="file"; filename="A551A700-46D4-470A-86E7-52AD2B445847.dat" 
Content-Type: application/octet-stream 

/// FILE DATA 
--B0EC8D07-EBF1-4EA7-966C-E492A9F2C36E-- 
Problemi correlati