我使用的是Spring 4的最新版本,我通常沒有問題編寫RESTful控制器。有一個傳統的Web應用程序,它使用java.net.HTTPUrlConnection來執行多部分上傳。我們上傳的數據有3條: 1是PDF文件,我們有字節,那麼另外兩條數據只是2個字符串字段。Spring MVC文件上傳與多部分數據和單元測試
首先讓我告訴你春天REST控制器接受數據:
@RequestMapping(value = "/save", method = RequestMethod.POST, produces = "application/json", consumes = "multipart/form-data")
public @ResponseBody boolean saveData(@RequestPart(value = "field1") String field1, @RequestPart(value = "field2") String field2, @RequestParam(value = "pdfbytes") String pdfbytes)
{
System.out.println("saveData: field1=" + field1);
System.out.println("saveData: field2=" + field2);
System.out.println("saveData: pdfbytes=" + pdfbytes);
boolean response = true;
return response;
}
在前端的編碼,發送使用數據「java.net.HttpURLConnection中的」 看起來是這樣的:
String boundary = MultiPartFormOutputStream.createBoundary();
URL uploadDocumentUrl = new URL(protocol + "://" + host + UPLOAD_EDITED_DOCUMENT);
HttpURLConnection urlConn = (HttpURLConnection) MultiPartFormOutputStream.createConnection(uploadDocumentUrl);
urlConn.setRequestProperty("Content-Type", MultiPartFormOutputStream.getContentType(boundary));
urlConn.setRequestProperty("Connection", "Keep-Alive");
urlConn.setRequestProperty("Cache-Control", "no-cache");
urlConn.setRequestProperty("User-Agent", userAgent);
urlConn.setRequestMethod("POST");
MultiPartFormOutputStream out = new MultiPartFormOutputStream(urlConn.getOutputStream(), boundary);
String pdfbytes= getEncodedDocument(pdf);
out.writeField("field1", field1);
out.writeField("field2", field2);
out.writeField("pdfbytes", pdfbytes);
out.close();
int responseCode = urlConn.getResponseCode();
String responseMessage = urlConn.getResponseMessage();
「MultiPartFormOutputStream」是創建通過HttpURLConnection的發送數據的自定義對象,這是非常標準的代碼。我現在確實信任它。
因此,根據我們如何發送數據,是否需要更改控制器來做任何不同的事情,還是看起來不錯?
現在,這裏是代碼,我使用單元測試該控制器:
@Test
public void testMockUpload() throws Exception
{
// Load resource being uploaded
byte[] pdfbytes = getByteArrayFromFile(FILENAME);
MockMultipartFile firstFile = new MockMultipartFile("field1", "", "text/plain", "field1 data".getBytes());
MockMultipartFile secondFile = new MockMultipartFile("field2", "", "text/plain", "field2 data".getBytes());
MockMultipartFile jsonFile = new MockMultipartFile("pdfbytes", "", "text/plain", pdfbytes);
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.fileUpload(BASE_URL + "/save").file(firstFile).file(secondFile).file(jsonFile)
.with(user(USERNAME).roles("role1", "role2")).contentType(MediaType.MULTIPART_FORM_DATA_VALUE);
this.mockMvc.perform(requestBuilder).andDo(print()).andExpect(status().isOk());
}
我也得到返現的錯誤,則: org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException
我正在調查。如果我需要對如何創建我的測試進行任何更改,我對此非常開放。最終,我會讓所有的東西在發送代碼,接收控制器和單元測試之間同步。
提前致謝!像往常一樣,如果有任何其他數據或信息,我可以提供,請讓我知道。謝謝!