Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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 通过RestController从Spring Crudepository流式处理_Java_Spring_Spring Data Jpa_Spring Restcontroller_Spring Webflux - Fatal编程技术网

Java 通过RestController从Spring Crudepository流式处理

Java 通过RestController从Spring Crudepository流式处理,java,spring,spring-data-jpa,spring-restcontroller,spring-webflux,Java,Spring,Spring Data Jpa,Spring Restcontroller,Spring Webflux,我正试图通过RestController从Crudepository流式传输大型数据集。我正在使用HSQLDB进行测试。然而,无论我做什么,我都不能让它工作。首先,我尝试使用streams: 流尝试 存储库 公共接口PersonRepository扩展了Crudepository{ @查询(“从人员p中选择p”) streamAll(); } RestController @RestController 公共类PersonRestController{ @自动连线 个人知识库; @事务性(只读

我正试图通过RestController从Crudepository流式传输大型数据集。我正在使用HSQLDB进行测试。然而,无论我做什么,我都不能让它工作。首先,我尝试使用streams:

流尝试 存储库
公共接口PersonRepository扩展了Crudepository{
@查询(“从人员p中选择p”)
streamAll();
}
RestController
@RestController
公共类PersonRestController{
@自动连线
个人知识库;
@事务性(只读=真,传播=传播。必需)
@GetMapping(“流”)
公共流IngressponseBody GetPersonStream(){
返回新的StreamingResponseBody(){
@事务性(只读=真,传播=传播。必需)
@凌驾
public void writeTo(OutputStream OutputStream)引发IOException{
试一试(
PrintWriter writer=新的PrintWriter(outputStream);
Stream=personRepository.streamAll()
) {
流动
.map(person->person.getFirstName()+“”+person.getLastName())
.forEach(名称->{
writer.println(姓名);
writer.flush();
});
}
}
};
}
}
但它没有起作用。Spring抱怨无论我做了什么,都丢失了只读事务

然后我尝试使用WebFlux:

WebFlux尝试 存储库
公共接口PersonRepository扩展了Crudepository{
@查询(“从人员p中选择p”)
通量fluxAll();
}
RestController
@RestController
公共类PersonRestController{
@自动连线
个人知识库;
@事务(只读=真)
@GetMapping(value=“stream”,products=MediaType.APPLICATION\u stream\u JSON\u value)
公共流量getPersonStream(){
return personRepository.fluxAll();
}
}
给你

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.util.ArrayList<?>] to type [reactor.core.publisher.Flux<?>]
org.springframework.core.convert.ConverterNotFoundException:未找到能够从[java.util.ArrayList]类型转换为[reactor.core.publisher.Flux]类型的转换器

有没有一种简单的方法可以通过RestController从存储库中传输数据?

在您的WebFlux尝试中,
PersonRepository
需要扩展
reactiveCrudepository
我就是这样做的

存储库

@Query("SELECT c FROM Customer c")
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "0"))
public Stream<Customer> streamAll();

值得一提的是,第一个错误看起来像是线程问题(两个
@Transactional
注释可能在不同的地方寻找),这个用例可能应该在文档中明确说明。我试图不放,只放第一个,只放第二个,两者都放,但它们都不起作用。外部的事务性是无用的,因为另一个线程正在执行writeTo方法。内部事务被忽略,因为它注释的对象的方法不是Springbean。将writeTo方法的内容移动到另一个SpringBean的方法,并用Transactional注释,然后从StreamngResponseBody的writeTo方法调用该SpringBean方法。这会导致
org.springframework.data.mapping.PropertyReferenceException:找不到Person类型的属性saveAll这是因为它需要发布者;退房
public interface PersonRepository extends CrudRepository<Person, String> {

    @Query("select p from Person p")
    Flux<Person> fluxAll();

}
@RestController
public class PersonRestController {

    @Autowired
    private PersonRepository personRepository;

    @Transactional(readOnly = true)
    @GetMapping(value = "stream", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
    public Flux<Person> getPersonsStream() {

        return personRepository.fluxAll();
    }
}
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.util.ArrayList<?>] to type [reactor.core.publisher.Flux<?>]
@Query("SELECT c FROM Customer c")
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "0"))
public Stream<Customer> streamAll();
@Transactional(readOnly = true)
public void streamAll(final OutputStream outputStream) {
  try {
    final Stream<Customer> stream = customerRepository.streamAll();
    objectMapper.writeValue(outputStream, stream);
  } catch (Exception e) {
    log.error(e.getMessage(), e);
  }
}
@GetMapping("/stream")
@ResponseBody
public StreamingResponseBody streamAll() {
  return outputStream -> customerService.streamAll(outputStream);
}