Передача файла / потока между приложениями 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);
    }
}
Другие вопросы по тегам