Java 通过RestController从Spring Crudepository流式处理
我正试图通过RestController从Crudepository流式传输大型数据集。我正在使用HSQLDB进行测试。然而,无论我做什么,我都不能让它工作。首先,我尝试使用streams: 流尝试 存储库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{ @自动连线 个人知识库; @事务性(只读
公共接口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);
}