Java 从Spring MVC控制器传输BLOB时出错
我在Postgres中的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(...) {
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
中迁移?