2015-09-28 8 views
1

У меня есть служба Spring Rest, как указано ниже.Невозможно отправить параметры POST с использованием метода MultiPartFile для отдыха с использованием пружины RestTemplate

@RequestMapping(value = "/mobilebuild", method = RequestMethod.POST) 
    public StringWrapper buildApp(@RequestParam("projectName") String projectName, @RequestParam("appId") String projectId, @RequestParam("version") String version, @RequestParam("app") MultipartFile file) { 
     //Process to build app 
     return WMUtils.SUCCESS_RESPONSE; 
    } 

Со стороны клиента я использую шаблон остального следующего

final List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(); 
messageConverters.add(new ByteArrayHttpMessageConverter()); 
messageConverters.add(new StringHttpMessageConverter(Charset.forName(CommonConstants.UTF8))); 
messageConverters.add(new ResourceHttpMessageConverter()); 
messageConverters.add(new SourceHttpMessageConverter<Source>()); 
messageConverters.add(new AllEncompassingFormHttpMessageConverter()); 
messageConverters.add(new FormHttpMessageConverter()); 

RestTemplate template = new RestTemplate(messageConverters); 

MultiValueMap<String, Object> parts = new LinkedMultiValueMap<String, Object>(); 
//Post Parameters 
parts.add("projectName", "FirstProject"); 
parts.add("appId", "app12345"); 
parts.add("version", "1.0"); 
// MultipartFile 
parts.add("app", new FileSystemResource(tempFilesStorageManager.getFilePath("/tmp/app.zip"))); 

HttpHeaders headers = new HttpHeaders(); 
headers.add("Cookie", auth); 
headers.setContentType(MediaType.MULTIPART_FORM_DATA); 

String url = "http://localhost:8080/AppManager/services/mobilebuild"; 

HttpEntity<MultiValueMap> requestEntity = new HttpEntity<MultiValueMap>(parts, headers); 
ResponseEntity<String> responseEntity = template.postForEntity(endpointAddress, requestEntity, String.class); 
String response = responseEntity.getBody(); 

Я не может прочитать параметры запроса от контроллера (сервер): получаю следующее сообщение об ошибке

Ошибка: параметр запроса projectName нет в запросе.

Итак, пожалуйста, предложите мне способ достичь этого.

ответ

0

Согласно javadoc из HttpEntity, первый параметр является тело запроса и второй из них заголовки запроса, но ваш клиент посылает параметры запроса в теле запроса и контроллер ожидает их @RequestParam, отсюда и ошибки.

Так что либо изменить клиент для отправки параметров запроса в конечной точке адреса URL, чтобы соответствовать вашей стороне сервера, как ...projectName=FirstProject&appId= app12345&version=1.0....

Или инкапсулировать все ваши @RequestParam полей внутри одного класса DTO и добавить @RequestBody аннотации на стороне сервера, если ваш клиент хочет отправить запрос.