Передача файла / потока между приложениями Spring Boot
У меня проблема с Spring Boot (v. 1.5).
Рассмотрим следующий сценарий: пользователь отправляет запрос POST в приложение Spring Boot (назовем его App_A). Контроллер в App_A отправляет новый POST-запрос другому приложению Spring Boot (будь то App_B), которое выполняет некоторые действия и возвращает файл Excel в App_A.
В настоящее время App_B возвращает файл как ModelAndView. Здесь возникает проблема. Файл не может быть десериализован и возвращен пользователю, конечно, это не удивительно. Мне было интересно, есть ли другой способ обработки этой передачи файлов? Может быть, возвращение октет-потока? Но как получить его в App_A?
Файлы AppA
@RestController
@RequestMapping("/some-route")
public class AppA_RestController {
private AppB_Connecor connector;
@PostMapping(value = "/some-handler")
public ModelAndView handleUserPostRequest(@RequestBody SomeDTO dto) {
return connector.fetchFile(dto);
}
}
public class AppB_Connecor {
public ModelAndView fetchFile(SomeDTO dto) {
HttpHeaders headers = jsonType();
HttpEntity<SomeDTO> entity = new HttpEntity<>(dto, headers);
RestTemplate rest = jsonRestTemplate(); // Just Jackson JSON-object mapper
String url = "http://some-website.abc/some-api";
return rest.postForEntity(url, entity, ModelAndView.class);
}
}
Файлы App_B
@RestController
@RequestMapping("/")
public class AppB_RestController {
@PostMapping(value = "some-api")
public ModelAndView generateExcelFile(@RequestBody SomeDTO dto) {
// Do stuff...
// ExcelFile extends AbstractXlsxView of apache.poi
return new ModelAndView(new ExcelFile(), "modelName", values);
}
}
1 ответ
Я понял свою проблему. Ссылка, размещенная в комментарии M. Prokhorov, указала мне в правильном направлении. Все, что мне нужно было сделать, это вернуться ResponseEntity<ByteArrayResource>
из AppB. Вы вызываете конечную точку REST из AppA, как и любой другой сервис REST. В AppA byte[]
это то, что вы получаете.
Файлы AppA
@RestController
@RequestMapping("/some-route")
public class AppA_RestController {
private AppB_Connecor connector;
@PostMapping(value = "/some-handler")
public ResponseEntity<byte[]> handleUserPostRequest(@RequestBody SomeDTO dto) {
return connector.fetchFile(dto);
}
}
public class AppB_Connecor {
public byte[] fetchFile(SomeDTO dto) {
HttpHeaders headers = jsonType();
HttpEntity<SomeDTO> entity = new HttpEntity<>(dto, headers);
RestTemplate rest = jsonRestTemplate(); // Just Jackson JSON-object mapper
String url = "http://some-website.abc/some-api";
return rest.postForObject(url, entity, byte[].class);
}
}
Файлы AppB
@RestController
@RequestMapping("/")
public class AppB_RestController {
@PostMapping(value = "some-api")
public ResponseEntity<ByteArrayResource> generateExcelFile(@RequestBody SomeDTO dto) {
// Do stuff...
OutputStream os = new ByteArrayOutputStream();
excelFile.getWorkbook().write(os); // apache.poi workbooks can be written to streams
ByteArrayResource res = new ByteArrayResource(os.getByteArray());
return ResponseEntity.ok(res);
}
}