使用Multipart Request,Spring MVC 3.2.4,@ RequestPart始终为null

时间:2014-05-05 08:34:50

标签: spring rest spring-mvc multipartform-data

我正在开发一个基于Spring 3.2.4的小型RESTful服务,并在this article之后编写一个自定义函数来发送Multipart请求。

首先,在控制器中,我编写了样本函数来测试

@RequestMapping(value = "/createUser", method = RequestMethod.POST)
public @ResponseBody String createUser(@RequestBody User user)
{
    if (user != null) {
        log.debug("Username: " + user.getUsername());
    }

    return "Successfully created!";
}

User对象包含使用 Jackson JSON 来获取和解析数据的用户信息。我还使用cURL发送请求和我测试的命令

curl http://localhost:8080/user/createUser --data-binary @test.txt -X POST -i -H "Content-Type: application/json"

这是 text.txt

{    
    "id" : "123456",
    "username" : "YOUR_USERNAME",
    "password" : "YOUR_PASSWORD",
    "email" : "YOUR_EMAIL"
}

应用程序返回"已成功创建!"并记录用户名。它运作良好。

其次,我认为一切都很简单,但我错了。当我编写以下函数以使用User和MultipartFile对象发送Multipart请求时。

@RequestMapping(
        value = "/createUser", 
        method = RequestMethod.POST, 
        consumes = {"multipart/mixed", "multipart/form-data"})
public @ResponseBody String createUser(
           @RequestPart("user") @Valid User user, 
           @RequestPart("file") MultipartFile file) {

    if (user != null) {
        log.debug("Username: " + user.getUsername());    // The username is null
    }

    return "Successfully created!";
}

我继续使用cURL来测试命令

curl http://localhost:8080/user/createUser --data-binary @test.txt -X POST -i -H "Content-Type: multipart/mixed; boundary=4ebf00fbcf09"

text.txt 文件已更改

--4ebf00fbcf09
Content-Disposition: form-data; name="user"
Content-Type: application/json; charset=UTF-8
Content-Transfer-Encoding: 8bit

{    
    "id" : "123456",
    "username" : "YOUR_USERNAME",
    "password" : "YOUR_PASSWORD",
    "email" : "YOUR_EMAIL"
}

--4ebf00fbcf09
Content-Disposition: form-data; name="file"; filename="no_thumb.jpg"
Content-Type: image/jpeg
Content-Transfer-Encoding: base64

<... File Data ...>

--4ebf00fbcf09--

我遇到的问题是@RequestPart总是 NULL 。详细说明:

  • 应用程序返回&#34;已成功创建!&#34;
  • User对象不为null,但服务器记录了&#34; Username:null&#34; 和MultipartFile对象。

我该如何解决?

请帮我解决这个问题。

1 个答案:

答案 0 :(得分:1)

答案有点晚,但仍然有用。这对于我来说,使用@RequestPart

附加有效负载和文件是有用的
RevocationFlag = X509RevocationFlag.EntireChain

使用下面的curl命令我也可以验证这个

@RequestMapping(method = RequestMethod.POST)
public @ResponseBody String create(@RequestPart Blah blah, 
        @RequestPart(value = "uploadfile", required=false) MultipartFile) {...}

确保转义有效内容,somevalid.zip(第二个-F是可选的,因为required设置为false)应该在执行curl的同一目录中,或者用文件的有效路径替换它。 / p>