Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用SpringMVC4.1解析多部分/表单数据(不是文件上载)时出现问题_Java_Spring_Spring Mvc_Controller_Multipartform Data - Fatal编程技术网

Java 使用SpringMVC4.1解析多部分/表单数据(不是文件上载)时出现问题

Java 使用SpringMVC4.1解析多部分/表单数据(不是文件上载)时出现问题,java,spring,spring-mvc,controller,multipartform-data,Java,Spring,Spring Mvc,Controller,Multipartform Data,我需要在SpringMVC控制器中解析一个多部分请求。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=------------------------2e2bf5fa2f7bbfb

我需要在SpringMVC控制器中解析一个多部分请求。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);
}

我做错了什么?

因为您使用POST方法提交数据,所以多部分内容将放在请求正文中,而不是作为请求参数

在第二种情况下,使用request param对象进行注释,spring将检查请求url中的参数。如果它不可用,spring将抛出一个错误。此外,您可以将请求参数设置为可选参数,也可以设置默认值

我的spring配置中缺少一件事:

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


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

一个是web请求参数,另一个是正文。这是有区别的。这里的更多信息:这真的很奇怪,因为我找到的关于使用spring的multipart的所有示例都对文件和字符串(例如文件标题)使用@RequestParam,并且至少文件只能在正文中。spring正在读取整个url字符串以获取请求参数。如果它们不在请求url中,则无法将它们提取为@RequestParameter。你的数据可能在身体里。如果需要不同的名称,请使用jaxon进行自定义映射为什么不能使用@RequestBody?因为@RequestBody包含所有字段,然后我必须对其进行解析,以便逐个获取字段。这还包括解码json字符串中的NLS字符。我认为有一种方法可以让spring为我做这件事。好吧,所以我使用了错误的注释。是否有注释将正文拆分为字段,对特殊字符进行解码,然后将字段作为单独的字符串提供给我?
<bean id="multipartResolver"
      class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
  <property name="maxUploadSize" value="100000"/>
</bean>