Невозможно получить ответ с помощью R2DB C Postgresql WebFlux - PullRequest
1 голос
/ 09 мая 2020

Я учусь R2DBC с пружинным ботинком WebFlux и Postgresql. Я успешно настроил базу данных 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 для тестирования, и он не смог получить ничего ... Просто буферизовал ...

Что я здесь делаю не так? Я мог бы пропустить очень важную вещь c. Любая помощь будет благодарна.

РЕДАКТИРОВАТЬ

Если я распечатаю поток в getResourcesMethod2, он будет напечатан как FluxOnErrorResume вместо FluxArray, хотя . Я думаю, что это может быть связано с конфигурацией базы данных. Но я не могу найти курс root для этого ..

1 Ответ

1 голос
/ 10 мая 2020

Postman не поддерживает возврат потоков.

для него есть открытый запрос функции, но он существует с 2018 года.

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

вы можете использовать curl и отключить буферизацию с помощью флага -N для потоковой передачи ответа.

curl -N <your_url>

Если вы не хотите использовать curl только для тестирования, вы можете collectList и верните клиенту Mono<List<T>>, и воспользуйтесь почтальоном.

...