我需要在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);
}
我做错了什么?
答案 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的一部分。