0

I was trying to upgrade R2DBC from 0.4.0 to 1.0.0. while doing that I am getting error in update which was working fine in version 0.4.0.

Build.gradle that I am using

plugins {
    id 'org.springframework.boot' version '2.7.2'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'java'
}

group = '<group>'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    maven {
        url "https://nexus/repository/maven-public/"
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

dependencies {
    implementation ('org.springframework.boot:spring-boot-starter-actuator:2.7.4') {
        exclude group: 'org.springframework.boot', module: 'spring-boot'
    }
    implementation 'org.springframework.boot:spring-boot:2.7.4'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa:2.7.4'
    implementation ('org.springframework.boot:spring-boot-starter-data-r2dbc:2.7.4') {
        exclude group: 'io.r2dbc', module: 'r2dbc-spi'
        exclude group: 'io.r2dbc', module: 'r2dbc-pool'
        exclude group: 'org.springframework.data', module: 'spring-data-r2dbc'
        exclude group: 'io.projectreactor', module: 'reactor-core'
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter'
    }
    implementation 'io.r2dbc:r2dbc-spi:1.0.0.RELEASE'
    implementation 'org.springframework.boot:spring-boot-starter:2.7.4'
    implementation ('io.r2dbc:r2dbc-pool:1.0.0.RC1') {
        exclude group: 'io.projectreactor', module: 'reactor-core'
    }
    implementation ('org.springframework.data:spring-data-r2dbc:1.5.3') {
        exclude group: 'org.springframework', module: 'spring-r2dbc'
        exclude group: 'io.r2dbc', module: 'r2dbc-spi'
        exclude group: 'io.projectreactor', module: 'reactor-core'
        exclude group: 'org.springframework.data', module: 'spring-data-commons'
        exclude group: 'org.springframework.data', module: 'spring-data-relational'
        exclude group: 'org.springframework', module: 'spring-tx'
        exclude group: 'org.springframework', module: 'spring-context'
        exclude group: 'org.springframework', module: 'spring-beans'
        exclude group: 'org.springframework', module: 'spring-core'
    }
    implementation 'org.springframework.data:spring-data-commons:2.7.3'
    implementation 'org.springframework.data:spring-data-relational:2.4.3'
    implementation 'org.springframework:spring-tx:5.3.23'
    implementation 'org.springframework:spring-context:5.3.23'
    implementation 'org.springframework:spring-beans:5.3.23'
    implementation 'org.springframework:spring-core:5.3.23'


    implementation ('org.springframework:spring-r2dbc:5.3.23') {
        exclude group: 'io.r2dbc', module: 'r2dbc-spi'
        exclude group: 'io.projectreactor', module: 'reactor-core'
    }
    implementation 'io.projectreactor:reactor-core:3.4.23'



    implementation ('com.oracle.database.r2dbc:oracle-r2dbc:1.0.0') {
        exclude group: 'com.oracle.database.jdbc', module: 'ojdbc11'
        exclude group: 'io.projectreactor', module: 'reactor-core'
    }
    implementation ('org.springframework.boot:spring-boot-starter-webflux') {
        exclude group: 'io.projectreactor', module: 'reactor-core'
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter'
    }
    implementation files('./lib/eagle_commons-0.0.1-SNAPSHOT-plain.jar')
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'

    implementation ('sg.com.gic:crypto-lib:1.0.5') {
        exclude group: 'slf4j', module: 'slf4j-api'
        exclude group: 'ch.qos.logback', module: 'logback-core'
        exclude group: 'ch.qos.logback', module: 'logback-classic'
    }
    implementation group: 'com.oracle.database.jdbc', name: 'ojdbc11', version: '21.7.0.0'
    implementation group: 'org.springdoc', name: 'springdoc-openapi-webflux-ui', version: '1.6.11'
    implementation group: 'org.modelmapper', name: 'modelmapper', version: '3.1.0'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

Below is the SQL Update Query from R2dbcRepository Repository:

@Modifying
  @Query(value = "UPDATE <Table_name> SET PARAM_VALUE=:paramValue WHERE BATCH_ID=:batchId and PARAM_NAME=:paramName")
  Mono<Integer> updateODADateParam(String paramValue, String batchId, String paramName);

Error Log:

2022-10-05 09:47:37,080 DEBUG [ForkJoinPool.commonPool-worker-3] org.springframework.r2dbc.core.DefaultDatabaseClient$DefaultGenericExecuteSpec: Executing SQL statement [UPDATE <table_name> SET PARAM_VALUE=:P0_paramValue WHERE BATCH_ID=:P1_batchId and PARAM_NAME=:P2_paramName]
2022-10-05 09:47:37,121 ERROR [ForkJoinPool.commonPool-worker-7] com.gic.eagle.txnHld.handler.RESIBatchDateHandler: Error [class java.lang.Long cannot be cast to class java.lang.Integer (java.lang.Long and java.lang.Integer are in module java.base of loader 'bootstrap')]
java.lang.ClassCastException: class java.lang.Long cannot be cast to class java.lang.Integer (java.lang.Long and java.lang.Integer are in module java.base of loader 'bootstrap')
    at java.base/java.util.stream.Collectors.lambda$summingInt$19(Collectors.java:673)
    at reactor.core.publisher.MonoStreamCollector$StreamCollectorSubscriber.onNext(MonoStreamCollector.java:132)
    at reactor.core.publisher.FluxFlatMap$FlatMapMain.tryEmit(FluxFlatMap.java:543)
    at reactor.core.publisher.FluxFlatMap$FlatMapInner.onNext(FluxFlatMap.java:984)
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)
    at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onNext(FluxConcatArray.java:364)
    at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:118)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299)
    at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.request(FluxMapFuseable.java:360)
    at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.request(FluxFilterFuseable.java:191)
    at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.request(FluxConcatArray.java:461)
    at reactor.core.publisher.FluxPeek$PeekSubscriber.request(FluxPeek.java:138)
    at reactor.core.publisher.FluxFlatMap$FlatMapInner.onSubscribe(FluxFlatMap.java:964)
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onSubscribe(FluxPeek.java:171)
    at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onSubscribe(FluxConcatArray.java:350)
    at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onSubscribe(FluxFilterFuseable.java:87)
    at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onSubscribe(FluxMapFuseable.java:265)
    at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:55)
    at reactor.core.publisher.Flux.subscribe(Flux.java:8466)
    at reactor.core.publisher.FluxConcatArray$ConcatArrayDelayErrorSubscriber.onComplete(FluxConcatArray.java:443)
    at reactor.core.publisher.FluxConcatArray.subscribe(FluxConcatArray.java:73)
    at reactor.core.publisher.Flux.subscribe(Flux.java:8466)
    at reactor.core.publisher.FluxFlatMap$FlatMapMain.onNext(FluxFlatMap.java:426)
    at reactor.core.publisher.FluxOnAssembly$OnAssemblySubscriber.onNext(FluxOnAssembly.java:539)
    at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122)
    at reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner.onNext(MonoFlatMapMany.java:250)
    at reactor.core.publisher.FluxUsingWhen$UsingWhenSubscriber.onNext(FluxUsingWhen.java:345)
    at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79)
    at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:200)
    at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122)
    at reactor.core.publisher.FluxConcatArray$ConcatArraySubscriber.onNext(FluxConcatArray.java:201)
    at reactor.core.publisher.MonoFlatMapMany$FlatMapManyInner.onNext(MonoFlatMapMany.java:250)
    at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2398)
    at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onSubscribeInner(MonoFlatMapMany.java:150)
    at reactor.core.publisher.MonoFlatMapMany$FlatMapManyMain.onNext(MonoFlatMapMany.java:189)
    at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172)
    at oracle.r2dbc.impl.AsyncLock.lambda$get$2(AsyncLock.java:167)
    at oracle.r2dbc.impl.AsyncLock.unlock(AsyncLock.java:125)
    at oracle.r2dbc.impl.AsyncLock$UsingConnectionSubscriber.terminate(AsyncLock.java:516)
    at oracle.r2dbc.impl.AsyncLock$UsingConnectionSubscriber.onComplete(AsyncLock.java:502)
    at reactor.core.publisher.StrictSubscriber.onComplete(StrictSubscriber.java:123)
    at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onComplete(Operators.java:2058)
    at org.reactivestreams.FlowAdapters$FlowToReactiveSubscriber.onComplete(FlowAdapters.java:221)
    at oracle.jdbc.internal.CompletionStageUtil$IteratorSubscription.emitComplete(CompletionStageUtil.java:804)
    at oracle.jdbc.internal.CompletionStageUtil$IteratorSubscription.emitItems(CompletionStageUtil.java:751)
    at java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1426)
    at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
    at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
    at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
    at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
    at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:183)

Originally raised the issue here: https://github.com/oracle/oracle-r2dbc/issues/97

Got the information from Oracle team that the issue could be same as https://github.com/oracle/oracle-r2dbc/issues/89

If anybody can point out what is wrong with dependency version, would be helpful. Thanks

Amar Singh
  • 33
  • 1
  • 4
  • Don't. You are working against the dependency management, stick with the version supplied with the `spring-boot-starter-r2dbc` isnteda of excluding it and manually trying to shoehorn something else in. – M. Deinum Oct 05 '22 at 07:48

2 Answers2

1

Don't mess around with overrides and manually managing your dependencies. That will only lead to issues. Also using Spring Data R2DBC is tied to specific versions of R2DBC so you cannot simply upgrade, you have to wait for a version that supports that specific version.

If you want to override versions follow the documented approach instead of all the excludes and overrides.

plugins {
    id 'org.springframework.boot' version '2.7.4'
    id 'io.spring.dependency-management' version '1.0.12.RELEASE'
    id 'java'
}

group = '<group>'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

repositories {
    maven {
        url "https://nexus/repository/maven-public/"
    }
}

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

ext['oracle-database.version']='21.7.0.0'

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'

    implementation 'com.oracle.database.r2dbc:oracle-r2dbc'
    implementation files('./lib/eagle_commons-0.0.1-SNAPSHOT-plain.jar')
    compileOnly 'org.projectlombok:lombok'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    annotationProcessor 'org.projectlombok:lombok'

    implementation 'sg.com.gic:crypto-lib:1.0.5' 
    implementation group: 'com.oracle.database.jdbc', name: 'ojdbc11'
    implementation group: 'org.springdoc', name: 'springdoc-openapi-webflux-ui', version: '1.6.11'
    implementation group: 'org.modelmapper', name: 'modelmapper', version: '3.1.0'

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

This will fix all the excludes and incompatible versions. You cannot use R2DBC 1.0.0 with Spring BOot 2.7 (AFAIK) you would need to upgrade to Spring Boot 3.0.0 (as that includes the proper Spring Data version and R2DBC version which isn't compatible with Spring Boot 2.7 as it requires Spring Framework 6, java 17 etc.).

If you want to upgrade, modify the Spring Boot plugin version and everything else should be included automatically.

M. Deinum
  • 115,695
  • 22
  • 220
  • 224
0

R2dbc 1.0.0 introduces several breaking changes, esp. some aggregate functions, eg. count returns Long instead of Integer.

I do not think the Spring Boot 2.7.x managed Spring Data R2dbc is ready for R2dbc 1.0.0. The latest Spring Data R2dbc(aligned to R2dbc 1.0.0) is upgraded to Spring Boot 3.0 code base.

  1. Keep to use Spring Boot 2.7.5 and built-in Spring Data R2dbc.
  2. if you want to use the latest R2dbc 1.0.0, consider Spring Boot 3.0.0-RC2, Spring Boot 3.0 is close to GA status.
Hantsy
  • 8,006
  • 7
  • 64
  • 109