24

Spring 3.2 に基づいて RESTful サービスを開発しています。XML または JSON 形式のデータを含む 2 番目の部分と、イメージ ファイルを含む 2 番目の部分を使用して、混合マルチパート HTTP 要求を処理するコントローラーで問題に直面しています。

リクエストの受信に@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 に応じて評価され、最終的に User クラスにアンマーシャリングされることが期待されます (私は Jaxb2 を使用しています。マーシャラー/アンマーラーは、 XML データを本文として渡し、@RequestBody アノテーションを使用すると、他のすべてのコントローラー メソッドでプロシージャが正常に動作します)。

しかし、実際に起こっていることは、ファイルが正しく検出され、MultipartFile として解析されたにもかかわらず、「ユーザー」部分が表示されず、要求が常に失敗し、コントローラー メソッドの署名と一致しないということです。

複数のクライアント タイプで問題を再現しましたが、マルチパート リクエストの形式は問題ないと確信しています。

この問題を解決するのを手伝ってください。混合/マルチパート リクエストを受け取るための回避策があるかもしれません。

よろしくお願いいたします。

ラグヴェンドラ

4

5 に答える 5

9

問題を解決したかどうかはわかりませんが、@RequestPart と MultipartFile を混在させると、JSON オブジェクトがコントローラーによって取得されないという同様の問題もありました。

呼び出しのメソッド シグネチャは正しいようです。

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

// ... CODE ... 
}

ただし、リクエストが次のようになっていることを確認してください。

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--
于 2013-08-29T05:47:35.577 に答える
-4

やってみました

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

また

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

これがうまくいかない場合は、私たちに見せてもらえますかmapping.xml

于 2013-04-26T06:55:18.190 に答える