MultipartFile + String в качестве параметра запроса с использованием RestTemplate в Spring - PullRequest
0 голосов
/ 24 января 2019

В моем весеннем загрузочном приложении мне нужно передать значение String вместе с MultipartFile как Requestparam. Контроллер находится ниже, где я конвертирую MultipartFile в java.io.File и затем передаю его в контроллер DAO с помощью restTemplate.

Запрос от Angular сначала попадет в Upload Controller, затем UploadController является клиентом (Java) и будет вызывать сервер svs-ba-dao Controller с базовым URL. 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 Controller ловит его, как показано ниже

@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

Итак, я запускаю свое приложение и вызываю /csvUpload, который генерирует запрос POST. Я получаю ошибку ниже.

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 является правильным, поскольку я не получаю никакой ошибки. я правильно называю Base URL , передавая значения requestparam. т.е. parentPkId =? & файл = multipartFile

http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile
честно говоря, я не работал над этим раньше. Там, где я делаю что-то не так, приветствуются любые предложения или исправления. Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 25 января 2019

Вы можете сделать несколько вещей, чтобы понять, что на самом деле происходит:

  1. Попробуйте вызвать вашу конечную точку для csvUpload в svs-ba-dao Controller из почтальона, чтобы проверить, работает ли она независимо.Также обновите свой метод 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.

0 голосов
/ 25 января 2019

Здесь я обнаружил, что был не прав

csvUpload будет содержать URL-адрес, который должен быть передан в шаблоне отдыха

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

Я нашел этот базовый URL-адрес: т.е.csvUpload http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=multipartFile отправка с UploadController был неправильным.

Нет необходимости указывать в URL-адресе что-то вроде multipartFile для mediaType.это автоматически поднимет.но для некоторых URL необходимо указать ?mediaType=json при отправке объекта JSON.

Вот моя обновленная база URL : http://localhost:8082/svs-ba-dao/csvUpload?parentPkId=&file=

0 голосов
/ 24 января 2019

Нет проблем при звонке.Посмотрите на ошибку трассировки стека.В методе 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)

Просто проверьте номер строки 59 в csvUpload метод UploadController .Вы найдете свою ошибку.

Посмотрите на это .как вызвать multipart, используя шаблон отдыха.

...