在 Spring 引导应用程序之间传递 file/stream
Passing file/stream between Spring Boot applications
我遇到了 Spring 引导(1.5 版)的问题。
考虑以下场景:
用户向 Spring 启动应用程序发送 POST 请求(我们称之为 App_A)。
App_A 中的控制器向另一个 Spring 启动应用程序(是 App_B)发送一个新的 POST 请求,该应用程序执行一些魔法和 returns 一个 Excel文件到 App_A.
当前 App_B returns 文件作为 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);
}
}
我解决了我的问题。 Link posted in comment by M. Prokhorov 指出了我正确的方向。我所要做的就是从 AppB return 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);
}
}
我遇到了 Spring 引导(1.5 版)的问题。
考虑以下场景: 用户向 Spring 启动应用程序发送 POST 请求(我们称之为 App_A)。 App_A 中的控制器向另一个 Spring 启动应用程序(是 App_B)发送一个新的 POST 请求,该应用程序执行一些魔法和 returns 一个 Excel文件到 App_A.
当前 App_B returns 文件作为 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);
}
}
我解决了我的问题。 Link posted in comment by M. Prokhorov 指出了我正确的方向。我所要做的就是从 AppB return 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);
}
}