Как добавить входной поток в составной http-запрос? (Ява Весна)

Я создаю службу REST, используя контроллер отдыха Spring 4, и тестирую Spring RestTemplate.

Я хотел бы принять запрос на создание нового файла (POST).

Понятие файла в моей системе состоит из двух частей — (1) Метаданные, (2) Контент. Поэтому я определил свой контроллер отдыха для приема MultipartHttpServletRequest. Я хочу вытащить карту метаданных из одной части и поток ввода файла из второй части, но я не уверен, как это сделать.

Наличие входного потока вместо всего файла в запросе важно, потому что файлы могут быть очень большими, и я не хочу нагружать сеть, заставляя пользователей отправлять гигантские http-запросы со всеми данными файла.

Ниже у меня есть неработающая реализация моего метода контроллера отдыха и мой тест, который я использую для отправки тестового Http-запроса. Когда я запускаю приведенный ниже код, я получаю исключение 500 Server Error, потому что я считаю, что запрос не соответствует тому, как я настроил RestController.

Я попытался в контроллере создать общие объекты @RequestParam вместо Map и InputStream. Это будет работать без исключения 500, но затем объекты интерпретируются как строки, а это не то, что мне нужно (это было бы нормально для работы с метаданными, но мне нужен InputStream для файла!).

Создайте запрос:

public void createAndSendRequest() throws IOException {
   MultiValueMap<String,Object> requestMap = new LinkedMultiValueMap<String, Object>();
   url = "http:/my.domain/someService/document";
   method = HttpMethod.POST;
   returnType = String.class;

   // add metadata to the request
   Map<String, String> metadata = new HashMap<>();
   metadata.put("somedata1", "alpha");
   metadata.put("somedata2", "beta");
   metadata.put("somedata3", "gamma");
   requestMap.add("metadata", metadata);

   // add the file to the request (as a stream?)
   URL fileUrl = this.getClass().getClassLoader().getResource("test.txt");
   File file = new File(fileUrl.getFile());
   InputStream stream = new FileInputStream(file);
   InputStreamResource resource = new InputStreamResource(stream);
   requestMap.add("file", resource);

   response = restTemplate.exchange(url, method, new HttpEntity<Object>(requestMap, headers), returnType);
   handleResponse(response);
}

Метод Rest Controller для обработки запроса:

    @RequestMapping(value = "/document", method = RequestMethod.POST)
    public ResponseEntity<String> createDocument(MultipartHttpServletRequest request,
                @RequestParam("file") InputStream fileStream,
                @RequestParam("metadata") Map metadata) throws Exception {

       // do some file stream work
       int ch;
       ch = fileStream.read();
       while (ch != -1) {
           System.out.println((char) ch);
           ch = fileStream.read();
       }

       // do application stuff

       return new ResponseEntity(HttpStatus.CREATED);
    }

person Luke    schedule 15.10.2015    source источник
comment
Прочтите это и это   -  person Bond - Java Bond    schedule 15.10.2015