无法使用 R2DBC Postgresql WebFlux 获得响应

Posted

技术标签:

【中文标题】无法使用 R2DBC Postgresql WebFlux 获得响应【英文标题】:Unable get response with R2DBC Postgresql WebFlux 【发布时间】:2020-08-24 23:43:05 【问题描述】:

我正在学习 R2DBC 和弹簧靴 WebFluxPostgresql。我已经成功配置了在我的本地机器上运行的 PostgreSQL 数据库。我使用了以下依赖项和插件。

plugins 
    id 'org.springframework.boot' version '2.3.0.BUILD-SNAPSHOT'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
    id 'eclipse'


dependencies 
    implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    compile group: 'io.r2dbc', name: 'r2dbc-postgresql', version: '1.0.0.M7'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation('org.springframework.boot:spring-boot-starter-test') 
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    
    testImplementation 'io.projectreactor:reactor-test'

请找到我的代码

@SpringBootApplication
@EnableR2dbcRepositories
public class DemoServiceApplication 

    public static void main(String[] args) 
        SpringApplication.run(DemoServiceApplication.class, args);
    


@RestController
@RequiredArgsConstructor
class ResourceController 
    final ResourceRepository resourceRepository;

    @GetMapping("/method1") 
    public Flux<Resource> getResourcesMethod1()
         return resourceRepository.deleteAll().thenMany(
                 Flux.just(new Resource("name1", "description1", new Date()), new Resource("name2", "description2", new Date()))
                 .flatMap(resourceRepository::save))
         .thenMany(
                 resourceRepository.findAll()
                 .flatMap(data -> 
                     return Flux.just(data);
                 ));
    

    @GetMapping("/method2") 
    public Flux<Resource> getResourcesMethod2()
        return resourceRepository.findAll();     
    


@Configuration
class DatabaseConfig extends AbstractR2dbcConfiguration 

    @Bean
    public ConnectionFactory connectionFactory() 
        return new PostgresqlConnectionFactory(
                PostgresqlConnectionConfiguration.builder()
                        .host("localhost")
                        .port(5432)
                        .username("postgres")
                        .password("password")
                        .database("mydatabase")
                        .build());
    




interface ResourceRepository extends ReactiveCrudRepository<Resource, Integer> 



@Data
class Resource 
    @Id
    Integer id;

    final String name;
    final String description;
    final Date createdDate;

    public Resource(String name, String description, Date createdDate) 
        this.name = name;
        this.description = description;
        this.createdDate = createdDate;
    

从上面的代码(使用getResourcesMethod1)我能够成功删除数据并将数据插入到数据库表中。

但是,我无法从这两个其余端点检索到任何响应。我使用 Postman 进行测试,它无法检索任何东西...只是缓冲...

我在这里做错了什么?我可能错过了一个非常基本的东西。任何帮助将不胜感激。

编辑

如果我在getResourcesMethod2 中打印出通量,它将打印为FluxOnErrorResume 而不是FluxArray,尽管这是预期的。我认为这可能与数据库配置有关。但是我找不到这个的根课程..

【问题讨论】:

【参考方案1】:

Postman 不支持返回流。

有一个开放的功能请求,但自 2018 年以来一直存在。

https://github.com/postmanlabs/postman-app-support/issues/5040

您可以使用 curl 并通过 -N 标志禁用缓冲来流式传输响应。

curl -N <your_url>

如果你不想使用curl,只是为了测试,那么你可以collectList并返回一个Mono&lt;List&lt;T&gt;&gt;给客户端,然后使用postman。

【讨论】:

以上是关于无法使用 R2DBC Postgresql WebFlux 获得响应的主要内容,如果未能解决你的问题,请参考以下文章

R2DBC 无法使用 h2 协议创建连接

Java多数据Jdbc和R2dbc问题

R2dbc无法使用tcp与h2数据库一起使用

使用Spring Reactive(R2DBC)与MSSQL连接,创建bean时出错

Spring Boot 2.2 中的 r2dbc-postgresql 0.8.0.RC1 无法正常工作

JOOQ r2dbc 获取数据:无法解码具有 OID 51968 的 java.lang.String 类型的值