Java 在Spring启动应用程序之间传递文件/流

Java 在Spring启动应用程序之间传递文件/流,java,spring,file,spring-boot,modelandview,Java,Spring,File,Spring Boot,Modelandview,我对SpringBoot(1.5版)有一个问题 考虑以下场景: 用户向Spring Boot应用程序发送POST请求(我们称之为app_a)。 App_A中的控制器向另一个Spring Boot应用程序(可能是App_B)发送一个新的POST请求,该应用程序执行一些魔术,并向App_A返回一个Excel文件 当前应用程序以ModelAndView的形式返回文件。问题来了。文件不能被反序列化并返回给用户,当然这并不奇怪。 我一直在想是否有其他方法来处理这个文件传输? 也许是返回八进制流?但是如何在

我对SpringBoot(1.5版)有一个问题

考虑以下场景: 用户向Spring Boot应用程序发送POST请求(我们称之为app_a)。 App_A中的控制器向另一个Spring Boot应用程序(可能是App_B)发送一个新的POST请求,该应用程序执行一些魔术,并向App_A返回一个Excel文件

当前应用程序以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);
    }
}
@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);
    }
}
@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);
    }
}
@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);
    }
}
我解决了我的问题。我在评论中指出了正确的方向。我所要做的就是从AppB返回
ResponseEntity
。您可以像其他REST服务一样从AppA调用REST端点。在AppA中,字节[]是您收到的内容

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);
    }
}
@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);
    }
}
@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);
    }
}
@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);
    }
}
@RestController
@请求映射(“/some route”)
公共类AppA_RestController{
专用AppB_连接器;
@PostMapping(value=“/some handler”)
公共响应handleUserPostRequest(@RequestBody SomeDTO){
返回connector.fetchFile(dto);
}
}
公共类AppB_Connecor{
公共字节[]获取文件(SomeDTO-dto){
HttpHeaders=jsonType();
HttpEntity=新的HttpEntity(dto,标题);
RestTemplate rest=jsonRestTemplate();//仅限于JSON对象映射器
字符串url=”http://some-website.abc/some-api";
返回rest.postForObject(url、实体、字节[].class);
}
}
AppB文件

@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);
    }
}
@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);
    }
}
@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);
    }
}
@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);
    }
}
@RestController
@请求映射(“/”)
公共类应用程序控制器{
@后期映射(value=“某些api”)
公共响应生成ExcelFile(@RequestBody SomeDTO){
//做些事情。。。
OutputStream os=新的ByteArrayOutputStream();
excelFile.get工作簿().write(os);//可以将apache.poi工作簿写入流
ByteArrayResource res=新的ByteArrayResource(os.getByteArray());
返回响应度ok(res);
}
}
那怎么办?