在Spring中使用RestTemplate将MultipartFile +字符串作为请求参数

时间:2019-01-24 10:30:56

标签: java spring spring-boot spring-mvc resttemplate

在我的Spring Boot应用程序中,我需要将String值和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值来正确调用基本URL ?即   parentPkId =?&file = multipartFile

http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile
 老实说我以前没有做过。 如果我做错了,欢迎任何线索或更正。预先感谢

3 个答案:

答案 0 :(得分:2)

在这里我发现我错了

  

csvUpload将保存应在其余模板中传递的URL

 @Value("${salama.dao.csvUpload.rest.url}")
        private String csvUpload;

我发现该基本网址:csvUpload http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile UploadController 发送是错误的。

无需在URL中为multipartFile指定类似mediaType的内容。它会自动捡起。 但是对于某些URL,如果发送JSON对象,则需要指定?mediaType=json

这是我更新后的基础 URL http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=

答案 1 :(得分:1)

打电话没有问题。仔细查看堆栈跟踪错误。 在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模板调用多部分。

答案 2 :(得分:1)

您可以做一些事情来了解实际发生的事情:

  1. 尝试从邮递员在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); }

  2. 将RestTemplate调用环绕到try-catch

    ResponseEntity<String> obj =restTemplate.exchange(csvUpload, HttpMethod.POST, requestEntity, String.class);

以查看来自svs-ba-dao Controller的异常。