使用spring-mvc 4.1

时间:2017-06-28 07:33:46

标签: java spring spring-mvc controller multipartform-data

我需要在spring-mvc控制器中解析多部分请求。 Spring版本是4.1.6。请求示例:

HEADER host: "localhost:8080"
HEADER accept: "*/*"
HEADER content-length: "539"
HEADER expect: "100-continue"
HEADER content-type: "multipart/form-data; boundary=------------------------2e2bf5fa2f7bbfbf"
BODY:
--------------------------2e2bf5fa2f7bbfbf
Content-Disposition: form-data; name="objectid"

160714.110239.GG
--------------------------2e2bf5fa2f7bbfbf--
Content-Disposition: form-data; name="geojson"

[a very long json string]
--------------------------2e2bf5fa2f7bbfbf

请求的确切格式不受我的控制。

只要我使用整个@RequestBody,我的RequestMapping就会解决:

@RequestMapping(value = "/coordinates", method = RequestMethod.POST)
public @ResponseStatus(value = HttpStatus.OK)
void coordinates(final HttpServletRequest request,
                 final @RequestBody String body) {
  final Enumeration<String> headerNames = request.getHeaderNames();
  while (headerNames.hasMoreElements()) {
    final String element = headerNames.nextElement();
    System.out.println("HEADER " + element + ": \"" + request.getHeader(element) + "\"" );
  }
  System.out.println("BODY:");
  System.out.println(body);
}

但是当我更改签名以便直接获取部件时,客户端会收到一条错误消息,说“不存在必需的字符串参数'objectid'”,我的映射不再解析(使用断点测试) 。这是失败的代码:

@RequestMapping(value = "/coordinates", method = RequestMethod.POST)
public @ResponseStatus(value = HttpStatus.OK)
void coordinates(final HttpServletRequest request,
                 final @RequestParam("objectid") String objectid,
                 final @RequestParam("geojson") String geojson) {
  final String remoteAddr = request.getRemoteAddr();
  System.out.println("coordinates from " + remoteAddr
      + ":\nobjectid=" + objectid
      + "\ngeojson=" + geojson);
}

我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于您使用POST方法提交数据,因此多部分内容将作为请求参数进入请求正文。

在第二种情况下,您使用请求参数对象进行注释,spring将检查请求URL中的参数。如果没有弹簧会抛出错误。此外,您可以将请求参数设置为可选参数,也可以设置默认值

答案 1 :(得分:1)

解决。

我的弹簧配置中缺少一件事:

<bean id="multipartResolver"
      class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
  <property name="maxUploadSize" value="100000"/>
</bean>

使用该解析器,@ RequestParam注释(在我的第二个java源代码示例中)起作用。是的,它是@RequestParam,尽管这些值不是URL的一部分。