在 Spring 中使用 RestTemplate 作为请求参数的 MultipartFile + String
Posted
技术标签:
【中文标题】在 Spring 中使用 RestTemplate 作为请求参数的 MultipartFile + String【英文标题】:MultipartFile + String as Request Param using RestTemplate in Spring 【发布时间】:2019-06-18 01:29:28 【问题描述】:在我的 Spring Boot 应用程序中,我需要将字符串值与 MultipartFile 一起作为Requestparam
传递。
Controller 在下面,我将 MultipartFile 转换为 java.io.File
,然后在 restTemplate
的帮助下将其传递给 DAO 控制器。
来自 Angular 的请求将首先点击上传控制器,然后 UploadController 是客户端(Java),它将使用基本 URL 调用服务器 svs-ba-dao 控制器。
csvUpload
包含基本 URL:http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile
@CrossOrigin
@RestController
public class UploadController
private static final Logger log = LogManager.getLogger(UploadController.class);
@Value("$salama.dao.csvUpload.rest.url")
private String csvUpload;
@Autowired
UploadHelperService uploadHelperService;
@PostMapping(value = "/csvUpload")
public String csvUpload(@QueryParam("parentPkId") String parentPkId, @RequestParam("file") MultipartFile file ) throws IllegalStateException, IOException
log.info("Calling csvUpload :" + csvUpload);
final HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
File cnvFile = uploadHelperService.multipartToFile(file,file.getOriginalFilename());
System.out.println("Converted File Name is -->"+cnvFile.getName());
final MultiValueMap<String, Object> data = new LinkedMultiValueMap<>();
data.add("parentPkId", parentPkId);
data.add("file", new FileSystemResource(cnvFile));
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<MultiValueMap<String, Object>>(data, requestHeaders);
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> obj =restTemplate.exchange(csvUpload, HttpMethod.POST,
requestEntity, String.class);
return obj.getBody();
在 svs-ba-dao 控制器中捕获如下
@RequestMapping(value="/csvUpload", method=RequestMethod.POST)
public String csvUpload(@RequestParam String parentPkId, @RequestParam MultipartFile file) throws IOException
log.info("Entered method csvUpload() of svs-ba-dao.class");
return uploadService.csvUpload(parentPkId,file);
我已将这些属性包含在我的应用程序的 application.properties 文件中:
spring.servlet.multipart.maxFileSize=1MB spring.servlet.multipart.maxRequestSize=1MB
所以我启动我的应用程序并调用生成 POST 请求的/csvUpload
。
我遇到了错误。
Converted File Name is -->testInput_TxnMpMotSlv.csv
2019-01-24T15:12:41,217 ERROR [[localhost].[/svs-ba-dao].[dispatcherServlet]] [http-nio-8085-exec-2] Servlet.service() for servlet [dispatcherServlet] in context with path [/svs-ba-dao] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpServerErrorException: 500 null] with root cause
org.springframework.web.client.HttpServerErrorException: 500 null
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:766) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:724) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:680) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:600) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
at com.svs-ba-dao.controller.UploadController.csvUpload(UploadController.java:59) ~[classes/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_192]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_192]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_192]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_192]
错误在 resttemplate 中,因为它取 null,但在语法上调用 RestTemplate 的方式是正确的,因为我没有收到任何错误。 我是否通过传递
requestparam
值正确调用 Base URL? IE parentPkId=?&file=multipartFile
http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile 老实说,我以前没有做过这方面的工作。 在我做错的地方,欢迎任何线索或更正。提前致谢
【问题讨论】:
用 try catch 和 sysout 包围您的 RestTemplate 调用 obj.getBody() ,看看引发了什么异常! 【参考方案1】:在这里我发现我错了
csvUpload 将保存应该在 rest 模板中传递的 URL
@Value("$salama.dao.csvUpload.rest.url")
private String csvUpload;
我找到了基本 URL:即 csvUpload
http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile
从 UploadController 发送错误。
无需在 URL 中为 mediaType
指定类似 multipartFile
的任何内容。它会自动拿起。
但是对于某些 URL 需要指定 ?mediaType=json
如果发送 JSON 对象。
这是我更新后的基础 URL :http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=
【讨论】:
【参考方案2】:调用没有问题。仔细查看您的堆栈跟踪错误。 在 csvUpload 方法中,您打印以下内容:
System.out.println("Converted File Name is -->"+cnvFile.getName());
日志中打印的这一行:
Converted File Name is -->testInput_TxnMpMotSlv.csv
所以打电话没问题。问题在这里:
at com.svs-ba-dao.controller.UploadController.csvUpload(UploadController.java:59)
只需检查 UploadController 的 csvUpload 方法中的行号 59。你会发现你的错误。
看看this。如何使用 rest 模板调用 multipart。
【讨论】:
ResponseEntity<String> obj =restTemplate.exchange(csvUpload, HttpMethod.POST, requestEntity, String.class);
这是我遇到错误的行。但无法深入挖掘根本原因,因为它在语法上是正确的@sajib【参考方案3】:
您可以做一些事情来了解实际发生的情况:
尝试通过邮递员在svs-ba-dao Controller
中调用您的 csvUpload 端点,看看它是否独立工作。此外,将您的 csvUpload 方法更新为
@RequestMapping(value="/csvUpload", method=RequestMethod.POST)
public String csvUpload(@RequestParam("parentPkId") String parentPkId,
@RequestParam("file") MultipartFile file) throws IOException
log.info("Entered method csvUpload() of svs-ba-dao.class");
return uploadService.csvUpload(parentPkId,file);
将您的 RestTemplate 呼叫转至try-catch
ResponseEntity<String> obj =restTemplate.exchange(csvUpload, HttpMethod.POST,
requestEntity, String.class);
为了查看来自svs-ba-dao Controller
的异常。
【讨论】:
我试过打电话给svs-ba-dao Controller
,它可以独立工作。但问题是当我试图从 ** UploadController
** 调用它时。
您可以通过在svs-ba-dao Controller
中添加headers = "content-type=multipart/form-data"
来检查吗?以上是关于在 Spring 中使用 RestTemplate 作为请求参数的 MultipartFile + String的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring 中使用 RestTemplate 作为请求参数的 MultipartFile + String
如何使用 spring 记录 RestTemplate 请求和响应?
如何在 Spring RestTemplate 中记录响应?
如何使用 RestTemplate 在 Spring MVC 应用程序中访问来自(来自 Spring RESTful 服务)的巨大 JSON