Spring boot Spring Boot-JPA Repository-Stream resultset无法使用next()提前抛出错误
我正在尝试从存储库中传输数据,并将其写入servlet输出流。流媒体传输时,我面临无法读取数据错误。我已经有了@Transactional注释Spring boot Spring Boot-JPA Repository-Stream resultset无法使用next()提前抛出错误,spring-boot,rest,jpa,spring-data-jpa,java-stream,Spring Boot,Rest,Jpa,Spring Data Jpa,Java Stream,我正在尝试从存储库中传输数据,并将其写入servlet输出流。流媒体传输时,我面临无法读取数据错误。我已经有了@Transactional注释 @Autowired private MyRepository < Y > repository; @Autowired private Gson gson; @Transactional(readOnly = true) public long writeData(ServletOutputStream outputStream) {
@Autowired
private MyRepository < Y > repository;
@Autowired
private Gson gson;
@Transactional(readOnly = true)
public long writeData(ServletOutputStream outputStream) {
JsonWriter writer = new JsonWriter(new OutputStreamWriter(outputStream, UTF_8));
int count = 0;
writer.beginArray();
try (Stream < T > stream = repository.findAll()) {
stream.forEach(e ->{
gson.toJson(e, e.getClass(), writer);
count++;
});
}
writer.endArray();
writer.flush();
writer.close();
}
@Autowired
私有MyRepository存储库;
@自动连线
私人Gson;
@事务(只读=真)
公共长写数据(ServletOutputStream outputStream){
JsonWriter writer=新的JsonWriter(新的OutputStreamWriter(outputStream,UTF_8));
整数计数=0;
writer.beginArray();
try(StreamStream=repository.findAll()){
stream.forEach(e->{
toJson(e,e.getClass(),writer);
计数++;
});
}
writer.endArray();
writer.flush();
writer.close();
}
错误:
org.hibernate.exception.genericjdbception:无法使用next()
MyRepository在配置类中注入了entitymanager bean。所以我能够在repository类中打印数据
但当程序控制流回到我执行此操作的方法时,我无法这样做,因为entitymanager不属于此类的作用域
我所做的是,将构造函数(MyRepository repo)添加到类中并更新配置文件。这就解决了问题
@Configuration
@EnableTransactionManagement
public class MyConfiguration extends ConfigurationTemplate < MyEntity > {
@Autowired
private EntityManager entityManager;
@Override
@Bean
@Scope("prototype")
public DataStreamWriter < MyEntity > streamWriter() {
return new DataStreamWriter < >(myRepository());
}
@Override
@Bean
public MyRepository myRepository() {
return new MyRepository < >(MyEntity.class, entityManager);
}
}
@配置
@启用事务管理
公共类MyConfiguration扩展了ConfigurationTemplate{
@自动连线
私人实体管理者实体管理者;
@凌驾
@豆子
@范围(“原型”)
公共DataStreamWriterstreamWriter(){
返回新的DataStreamWriter<>(myRepository());
}
@凌驾
@豆子
公共MyRepository MyRepository(){
返回新的MyRepository<>(MyEntity.class,entityManager);
}
}
MyRepository在配置类中注入了entitymanager bean。所以我能够在repository类中打印数据
但当程序控制流回到我执行此操作的方法时,我无法这样做,因为entitymanager不属于此类的作用域
我所做的是,将构造函数(MyRepository repo)添加到类中并更新配置文件。这就解决了问题
@Configuration
@EnableTransactionManagement
public class MyConfiguration extends ConfigurationTemplate < MyEntity > {
@Autowired
private EntityManager entityManager;
@Override
@Bean
@Scope("prototype")
public DataStreamWriter < MyEntity > streamWriter() {
return new DataStreamWriter < >(myRepository());
}
@Override
@Bean
public MyRepository myRepository() {
return new MyRepository < >(MyEntity.class, entityManager);
}
}
@配置
@启用事务管理
公共类MyConfiguration扩展了ConfigurationTemplate{
@自动连线
私人实体管理者实体管理者;
@凌驾
@豆子
@范围(“原型”)
公共DataStreamWriterstreamWriter(){
返回新的DataStreamWriter<>(myRepository());
}
@凌驾
@豆子
公共MyRepository MyRepository(){
返回新的MyRepository<>(MyEntity.class,entityManager);
}
}