Java 使用SpringMVC4.1解析多部分/表单数据(不是文件上载)时出现问题
我需要在SpringMVC控制器中解析一个多部分请求。Spring版本是4.1.6。请求的示例: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
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>