簡體   English   中英

使用spring-mvc 4.1解析多部分/表單數據(不上傳文件)時遇到問題

[英]trouble parsing multipart/form-data (not file upload) with spring-mvc 4.1

我需要在spring-mvc控制器中解析多部分請求。 春季版本為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);
}

但是,當我更改簽名以直接獲取零件時,客戶端會收到一條錯誤消息,提示“不存在必需的String參數'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);
}

我究竟做錯了什么 ?

由於您是使用POST方法提交數據的,因此多部分內容將作為請求參數而不是進入請求主體。

在第二種情況下,您使用請求參數對象進行了注釋,spring將檢查請求url中的參數。 如果其不可用,彈簧將引發錯誤。 此外,您可以將request參數設為可選參數,也可以提供默認值

解決。

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

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

使用該解析器,@ RequestParam批注(如我的第二個Java源示例所示)可以工作。 是的,它是@RequestParam,盡管這些值不是URL的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM