【问题标题】:Passing file/stream between Spring Boot applications在 Spring Boot 应用程序之间传递文件/流
【发布时间】:2018-05-05 05:05:13
【问题描述】:

我在使用 Spring Boot (v. 1.5) 时遇到问题。

考虑以下场景: 用户向 Spring Boot 应用程序(我们称之为 App_A)发送 POST 请求。 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);
    }
}

【问题讨论】:

标签: java spring file spring-boot modelandview


【解决方案1】:

我发现了我的问题。 LinkM. Prokhorov 在评论中发表的Link 指出了我正确的方向。我所要做的就是从 AppB 返回ResponseEntity&lt;ByteArrayResource&gt;。您可以像任何其他 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);
    }
}

【讨论】:

    猜你喜欢
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多