【问题标题】:Upgrade from oracle-r2dbc version 0.4.0 to 1.0.0 is resulting in class cast exception while update从 oracle-r2dbc 版本 0.4.0 升级到 1.0.0 导致更新时类转换异常
【发布时间】:2022-11-13 11:00:32
【问题描述】:

我试图将 R2DBC 从 0.4.0 升级到 1.0.0。 这样做时,我在更新中遇到错误,在 0.4.0 版中运行良好。

我正在使用的 Build.gradle

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()
}

下面是来自 R2dbcRepository Repository 的 SQL 更新查询:

@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);

错误日志:

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)

最初在这里提出了这个问题: https://github.com/oracle/oracle-r2dbc/issues/97

从 Oracle 团队获得的信息表明问题可能与 https://github.com/oracle/oracle-r2dbc/issues/89

如果有人能指出依赖版本有什么问题,将会有所帮助。 谢谢

【问题讨论】:

  • 不。您正在反对依赖管理,坚持使用spring-boot-starter-r2dbc isnteda 提供的版本,将其排除在外,并手动尝试插入其他内容。

标签: oracle spring-boot spring-data spring-data-r2dbc r2dbc


【解决方案1】:

不要乱用覆盖和手动管理您的依赖项。那只会导致问题。此外,使用 Spring Data R2DBC 与 R2DBC 的特定版本相关联,因此您不能简单地升级,您必须等待支持该特定版本的版本。

如果您想覆盖版本,请遵循the documented 方法,而不是所有排除和覆盖。

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()
}

这将修复所有排除和不兼容的版本。您不能将 R2DBC 1.0.0 与 Spring BOot 2.7 (AFAIK) 一起使用,您需要升级到 Spring Boot 3.0.0(因为它包括正确的 Spring Data 版本和与 Spring Boot 2.7 不兼容的 R2DBC 版本,因为它需要 Spring框架 6、Java 17 等)。

如果要升级,请修改 Spring Boot 插件版本,其他所有内容都应自动包含在内。

【讨论】:

    【解决方案2】:

    R2dbc 1.0.0 引入了一些重大更改,尤其是。一些聚合函数,例如。 count 返回 Long 而不是 Integer。

    我不认为 Spring Boot 2.7.x 管理的 Spring Data R2dbc 已经为 R2dbc 1.0.0 做好了准备。最新的 Spring Data R2dbc(与 R2dbc 1.0.0 对齐)升级到 Spring Boot 3.0 代码库。

    1. 继续使用 Spring Boot 2.7.5 和内置 Spring Data R2dbc。
    2. 如果要使用最新的R2dbc 1.0.0,考虑Spring Boot 3.0.0-RC2,Spring Boot 3.0接近GA状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 2023-01-13
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      相关资源
      最近更新 更多