Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Spring MVC控制器传输BLOB时出错_Java_Spring Mvc_Streaming_Blob - Fatal编程技术网

Java 从Spring MVC控制器传输BLOB时出错

Java 从Spring MVC控制器传输BLOB时出错,java,spring-mvc,streaming,blob,Java,Spring Mvc,Streaming,Blob,我在Postgres中的Blob中存储了一些二进制数据。我通过JPA与db合作,但这在本例中并不重要。我有一个SpringMVC@Controller,它应该能够通过端点为这些数据提供服务。我想流式传输数据,因为为什么要将其全部加载到内存中。大致如下: @Entity class MyEntity { @Lob Blob data; } @RequestMapping(...) public InputStreamResource getResource(...) {

我在Postgres中的
Blob
中存储了一些二进制数据。我通过JPA与db合作,但这在本例中并不重要。我有一个SpringMVC
@Controller
,它应该能够通过端点为这些数据提供服务。我想流式传输数据,因为为什么要将其全部加载到内存中。大致如下:

@Entity
class MyEntity {
    @Lob  
    Blob data;
}

@RequestMapping(...)
public InputStreamResource getResource(...) {
    return new InputStreamResource(myEntityRepository.findById(id).getData().getBinaryStream());
}
不幸的是,这给了我:

java.io.IOException:org.postgresql.util.psqleexception:错误:无效 大型对象描述符:1

我知道原因:当你处理斑点时,你需要。现在我试着:

  • 注释整个控制器方法
    @Transactional
    -没有帮助,因为当Spring开始将流复制到servlet响应时,它已经超出了事务方面。:'(

  • 我还验证了,如果我在控制器内部将输入流复制到
    byte[]
    中,所有这些都可以工作。但这不是流

  • 
    byte[]data=IOUtils.toByteArray(myEntityRepository.findById(id).getData().getBinaryStream());
    返回新的ByteArrayResource(数据);
    

    显然,问题在于执行
    @Transactional
    的方面更接近控制器方法,即获取返回值并将其转换为servlet响应的方法

    有没有办法重新排序方面?还有其他解决方案吗

    谢谢

    编辑: 似乎只需执行
    @EnableTransactionManagement(order=Ordered.HIGHEST_priority)
    就可以了,但不幸的是事实并非如此。可能是因为
    @EnableAspectJAutoProxy(proxyTargetClass=true)

    Edit2:
    这显然是一个更普遍的问题。
    @RequestMapping
    带注释的方法只返回
    ,但只有在调用完成后(包括所有方面和
    @Transactional
    )返回值(流)所以事实上,我希望将then transactional扩展到实际调用控制器方法的类,可能是整个
    Servlet.doXXX
    方法。没有好消息。

    结果我忽略了最简单但不太优雅的解决方案。我仍然可以注入
    HttpServletResponse
    >输出流
    到控制器的方法中,并将流复制到控制器的方法中。虽然不如返回
    InputStreamResource
    好,但可以工作。

    Spring版本?Spring Boot 1.5是否可以在Spring Boot 2.0中的
    Spring Webflux
    中迁移?