【问题标题】:Spring MVC @RequestBody give me an empty String when use with @RequestParam MultipartFile与 @RequestParam MultipartFile 一起使用时,Spring MVC @RequestBody 给我一个空字符串
【发布时间】:2013-03-08 06:41:23
【问题描述】:

我对此网络服务代码有疑问

@Controller
@RequestMapping("/u_tutorial")
public class UploadTutorial
{
    @RequestMapping(value = "tutorial1", method = RequestMethod.POST, headers = "Accept=application/json")
    @ResponseStatus(value = HttpStatus.OK)
    public void upload(@RequestBody String body, @RequestParam List<MultipartFile> file, Principal principal,
        HttpServletRequest request)
    {
        System.out.println("body: " + body); // always empty

        for (MultipartFile mf : file)
        {
            System.out.println("file: " + mf.getOriginalFilename());
        }
    }
}

情况是当我想上传请求正文中包含一些数据的文件时,我的正文变量总是给我一个空字符串。

但是当我尝试只使用“@RequestBody String body”或“@RequestParam List file”时,它就像一个魅力。

我做了一些搜索,发现是因为 InputStream 的问题。一些建议的解决方案已经讨论过,但与我的问题不太相关(或者可能是,但我不明白)。

谁能给我一个解决方案?谢谢。

PS 1. 这是我的库版本

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.core.version>3.1.4.RELEASE</spring.core.version>
    <spring.security.version>3.1.3.RELEASE</spring.security.version>
    <spring.data.mongodb.version>1.1.0.RELEASE</spring.data.mongodb.version>
    <cglib.version>2.2</cglib.version>
    <aspectj.version>1.6.10</aspectj.version>
    <mongodb.driver.version>2.10.1</mongodb.driver.version>
    <!-- Logging -->
    <slf4j.version>1.6.1</slf4j.version>
    <log4j.version>1.2.14</log4j.version>
    <javax.jstl-taglibs.version>1.1.2</javax.jstl-taglibs.version>
    <jackson.version>1.9.3</jackson.version>
    <!-- Testing -->
    <mockito.version>1.8.5</mockito.version>
    <junit.version>4.8.2</junit.version>
    <!-- Plugins -->
    <maven.copy.plugin.version>0.2.3</maven.copy.plugin.version>
    <maven.compiler.plugin.version>2.3.2</maven.compiler.plugin.version>
    <maven.apt.plugin.version>1.0</maven.apt.plugin.version>
    <!-- Utilities -->
    <apache.common.io.version>2.4</apache.common.io.version>
    <apache.common.fileupload.version>1.2.2</apache.common.fileupload.version>
    <jodatime.version>2.1</jodatime.version>
</properties>

PS 2. 对不起我的英语。

【问题讨论】:

    标签: web-services rest spring-mvc file-upload multipart


    【解决方案1】:

    您可以将“body”字符串设置为表单上的隐藏字段并将其作为另一个@RequestParam 发布,而不是将其作为单独的@RequestBody 参数。所以你的表单看起来像这样:

    <form id="myForm" method="post" enctype="multipart/form-data">
        <input type="hidden" name="body" value="bodyValue"/>
        <input type="file" name="file"/>
        ...
    

    控制器看起来像这样:

    public void upload(@RequestParam String body, @RequestParam List<MultipartFile> file, Principal principal, HttpServletRequest request)
    ....
    

    【讨论】:

    • 感谢您的回复clav,但我的客户可以是移动应用程序和网络应用程序。这个解决方案是否足够高效以适应两个平台?因为,不知何故,body 变量也需要映射到 JSON 或 XML 内容 (@RequestBody Map&lt;String, Object&gt; body)。 PS。考虑在 facebook 的帖子中发布一些带有描述的图片
    • 我不确定我是否理解。如果您只是发布表单数据并且body 参数只是一个字符串,您可以在其中放入任何您想要的内容(json、xml 等)。客户端的类型无关紧要,移动应用程序和网络应用程序都可以发布 HTML 表单,因此除非我遗漏了什么,否则这应该可以正常工作。您只需要检查内容类型标头或客户端类型即可了解如何解析数据。
    • 这就是我的意思!谢谢你的帮助。 (对不起我的困惑评论)
    【解决方案2】:

    我从不同的角度考虑了我的问题,发现可能是客户端无法同时在@RequestBody上传文件和发送数据。

    所以,我开始使用 WireShark 捕获请求。结果如我所料。数据丢失。请求中只剩下文件了。

    参考:Posting a File and Associated Data to a RESTful WebService preferably as JSON

    解决办法可能是重新构建我的web服务服务器的方法。

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-19
      • 2013-09-09
      • 2016-07-09
      • 2013-10-28
      • 2011-09-02
      • 1970-01-01
      相关资源
      最近更新 更多