在Spring Boot应用程序之间传递文件/流

时间:2017-11-21 16:34:24

标签: java spring file spring-boot modelandview

我遇到了Spring Boot(v.1.5)的问题。

考虑以下情况: 用户向Spring Boot应用程序发送POST请求(让我们称之为App_A)。 App_A中的控制器向另一个Spring Boot应用程序(可以是App_B)发送一个新的POST请求,该应用程序执行一些魔术并将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 个答案:

答案 0 :(得分:2)

我想出了我的问题。 pattern在评论中发布的Link指出了我正确的方向。我所要做的就是从AppB返回ResponseEntity<ByteArrayResource>。您可以像使用任何其他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);
    }
}