Skip to content

Handle Kotlin nullable value class param correctly in CoroutineUtils#36449

Open
T45K wants to merge 1 commit intospring-projects:mainfrom
T45K:fix_nullable_value_class_param
Open

Handle Kotlin nullable value class param correctly in CoroutineUtils#36449
T45K wants to merge 1 commit intospring-projects:mainfrom
T45K:fix_nullable_value_class_param

Conversation

@T45K
Copy link
Copy Markdown
Contributor

@T45K T45K commented Mar 11, 2026

as-is: under some conditions, spring framework throws an exception when calling a suspend function that has nullable value class param with a non-null value class object arg
to-be: spring framework can handle it correctly

reproducer: https://github.com/T45K/Spring-CoroutineUtils-bug-reproducer

root cause:
when CoroutineUtils is called to invoke such suspend functions with a non-null value class object arg, it tries to box the arg even though the type of the arg is already boxed value class.
that causes IllegalArgumentException

java.lang.IllegalArgumentException: argument type mismatch
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:108) ~[na:na]
	Suppressed: The stacktrace has been enhanced by Reactor, refer to additional information below: 
Error has been observed at the following site(s):
	*__checkpoint ⇢ Handler io.github.t45k.trial.spring.repo.TrialController#get(Continuation) [DispatcherHandler]
	*__checkpoint ⇢ HTTP GET "/" [ExceptionHandlingWebHandler]
Original Stack Trace:
		at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:108) ~[na:na]
		at java.base/java.lang.reflect.Method.invoke(Method.java:565) ~[na:na]
		at kotlin.reflect.jvm.internal.calls.CallerImpl$Method.callMethod(CallerImpl.kt:97) ~[kotlin-reflect-2.2.21.jar:2.2.21-release-469]
		at kotlin.reflect.jvm.internal.calls.CallerImpl$Method$Static.call(CallerImpl.kt:106) ~[kotlin-reflect-2.2.21.jar:2.2.21-release-469]
		at kotlin.reflect.jvm.internal.calls.ValueClassAwareCaller.call(ValueClassAwareCaller.kt:209) ~[kotlin-reflect-2.2.21.jar:2.2.21-release-469]
		at kotlin.reflect.jvm.internal.KCallableImpl.call(KCallableImpl.kt:151) ~[kotlin-reflect-2.2.21.jar:2.2.21-release-469]
		at org.springframework.core.CoroutinesUtils.box(CoroutinesUtils.java:177) ~[spring-core-7.0.5.jar:7.0.5]
		at org.springframework.core.CoroutinesUtils.lambda$invokeSuspendingFunction$1(CoroutinesUtils.java:140) ~[spring-core-7.0.5.jar:7.0.5]
		at kotlin.coroutines.intrinsics.IntrinsicsKt__IntrinsicsJvmKt$createCoroutineUnintercepted$$inlined$createCoroutineFromSuspendFunction$IntrinsicsKt__IntrinsicsJvmKt$4.invokeSuspend(IntrinsicsJvm.kt:270) ~[kotlin-stdlib-2.2.21.jar:2.2.21-release-469]
		at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith$$$capture(ContinuationImpl.kt:34) ~[kotlin-stdlib-2.2.21.jar:2.2.21-release-469]
		at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt) ~[kotlin-stdlib-2.2.21.jar:2.2.21-release-469]
		at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:100) ~[kotlinx-coroutines-core-jvm-1.10.2.jar:na]
		at kotlinx.coroutines.EventLoop.processUnconfinedEvent(EventLoop.common.kt:65) ~[kotlinx-coroutines-core-jvm-1.10.2.jar:na]
		at kotlinx.coroutines.internal.DispatchedContinuationKt.resumeCancellableWith(DispatchedContinuation.kt:383) ~[kotlinx-coroutines-core-jvm-1.10.2.jar:na]
		at kotlinx.coroutines.intrinsics.CancellableKt.startCoroutineCancellable(Cancellable.kt:26) ~[kotlinx-coroutines-core-jvm-1.10.2.jar:na]
		at kotlinx.coroutines.CoroutineStart.invoke(CoroutineStart.kt:358) ~[kotlinx-coroutines-core-jvm-1.10.2.jar:na]
		at kotlinx.coroutines.AbstractCoroutine.start(AbstractCoroutine.kt:134) ~[kotlinx-coroutines-core-jvm-1.10.2.jar:na]
		at kotlinx.coroutines.reactor.MonoKt.monoInternal$lambda$2(Mono.kt:88) ~[kotlinx-coroutines-reactor-1.10.2.jar:na]
		at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:61) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxFromMonoOperator.subscribe(FluxFromMonoOperator.java:83) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxDeferContextual.subscribe(FluxDeferContextual.java:58) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:80) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:80) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxPeek$PeekSubscriber.onNext(FluxPeek.java:203) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.complete(MonoIgnoreThen.java:297) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onNext(MonoIgnoreThen.java:191) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:296) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:479) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:184) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2564) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:142) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoZip$ZipInner.onSubscribe(MonoZip.java:471) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:155) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:56) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoZip$ZipCoordinator.request(MonoZip.java:219) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onSubscribe(MonoIgnoreThen.java:135) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:117) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoZip.subscribe(MonoZip.java:129) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:54) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:244) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.onComplete(MonoIgnoreThen.java:207) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onComplete(MonoFlatMap.java:189) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators.complete(Operators.java:137) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoZip.subscribe(MonoZip.java:121) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Mono.subscribe(Mono.java:4569) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:268) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:80) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:83) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.innerNext(FluxConcatMapNoPrefetch.java:258) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:868) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:306) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:130) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:184) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2564) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.request(MonoPeekTerminal.java:142) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:172) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapInner.onSubscribe(MonoFlatMap.java:292) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:96) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onSubscribe(MonoPeekTerminal.java:155) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:56) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:211) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2564) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2361) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2235) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:117) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onSubscribe(FluxPeekFuseable.java:178) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:56) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Mono.subscribe(Mono.java:4569) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onNext(FluxConcatMapNoPrefetch.java:206) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:335) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:294) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.innerComplete(FluxConcatMapNoPrefetch.java:274) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onComplete(FluxConcatMap.java:892) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:250) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:325) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators.complete(Operators.java:137) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoEmpty.subscribe(MonoEmpty.java:46) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:211) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2564) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.request(FluxPeekFuseable.java:144) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoFlatMap$FlatMapMain.request(MonoFlatMap.java:194) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.request(Operators.java:2325) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.request(FluxConcatMapNoPrefetch.java:338) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoNext$NextSubscriber.request(MonoNext.java:109) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:2361) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:2235) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoNext$NextSubscriber.onSubscribe(MonoNext.java:71) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxConcatMapNoPrefetch$FluxConcatMapNoPrefetchSubscriber.onSubscribe(FluxConcatMapNoPrefetch.java:163) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:200) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:82) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:54) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.Mono.subscribe(Mono.java:4569) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.subscribeNext(MonoIgnoreThen.java:268) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:51) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:75) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:56) ~[reactor-core-3.8.3.jar:3.8.3]
		at reactor.netty.http.server.HttpServer$HttpServerHandle.onStateChange(HttpServer.java:1378) ~[reactor-netty-http-1.3.3.jar:1.3.3]
		at reactor.netty.ReactorNetty$CompositeConnectionObserver.onStateChange(ReactorNetty.java:730) ~[reactor-netty-core-1.3.3.jar:1.3.3]
		at reactor.netty.transport.ServerTransport$ChildObserver.onStateChange(ServerTransport.java:529) ~[reactor-netty-core-1.3.3.jar:1.3.3]
		at reactor.netty.http.server.HttpServerOperations.handleDefaultHttpRequest(HttpServerOperations.java:870) ~[reactor-netty-http-1.3.3.jar:1.3.3]
		at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:796) ~[reactor-netty-http-1.3.3.jar:1.3.3]
		at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:115) ~[reactor-netty-core-1.3.3.jar:1.3.3]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:282) ~[reactor-netty-http-1.3.3.jar:1.3.3]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:434) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:361) ~[netty-codec-base-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:325) ~[netty-codec-base-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:249) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:355) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1429) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:918) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:176) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.handle(AbstractNioChannel.java:445) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.nio.NioIoHandler$DefaultNioRegistration.handle(NioIoHandler.java:388) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.nio.NioIoHandler.processSelectedKey(NioIoHandler.java:596) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.nio.NioIoHandler.processSelectedKeysOptimized(NioIoHandler.java:571) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.nio.NioIoHandler.processSelectedKeys(NioIoHandler.java:512) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.nio.NioIoHandler.run(NioIoHandler.java:484) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.SingleThreadIoEventLoop.runIo(SingleThreadIoEventLoop.java:225) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.channel.SingleThreadIoEventLoop.run(SingleThreadIoEventLoop.java:196) ~[netty-transport-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:1195) ~[netty-common-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.2.10.Final.jar:4.2.10.Final]
		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.2.10.Final.jar:4.2.10.Final]
		at java.base/java.lang.Thread.run(Thread.java:1447) ~[na:na]

(when the param is non-null type, its arg will be expected unboxed type).

image

solution: removing arg == null condition. it's unnecessary.

discussion: there are similar code in InvocableHandlerMethod. i'm not sure it should be fixed too

@spring-projects-issues spring-projects-issues added the status: waiting-for-triage An issue we've not yet triaged or decided on label Mar 11, 2026
@sdeleuze sdeleuze self-assigned this Mar 13, 2026
@sdeleuze sdeleuze added the theme: kotlin An issue related to Kotlin support label Mar 13, 2026
@sdeleuze
Copy link
Copy Markdown
Contributor

@T45K Can you please update the commit to comply with the DCO requirement?

@sdeleuze sdeleuze added the status: waiting-for-feedback We need additional information before we can continue label Mar 13, 2026
…correctly

Signed-off-by: T45K <tasktas9@gmail.com>
@T45K T45K force-pushed the fix_nullable_value_class_param branch from 1fb6bed to f70446a Compare March 13, 2026 08:21
@T45K
Copy link
Copy Markdown
Contributor Author

T45K commented Mar 13, 2026

@sdeleuze force pushed

@spring-projects-issues spring-projects-issues added status: feedback-provided Feedback has been provided and removed status: waiting-for-feedback We need additional information before we can continue labels Mar 13, 2026
@sdeleuze sdeleuze removed the status: feedback-provided Feedback has been provided label Mar 13, 2026
@T45K
Copy link
Copy Markdown
Contributor Author

T45K commented Mar 29, 2026

@sdeleuze
Sorry to rush you, but could you check this when you get a chance?

@sdeleuze sdeleuze added type: bug A general bug and removed status: waiting-for-triage An issue we've not yet triaged or decided on labels Apr 7, 2026
@sdeleuze sdeleuze added this to the 7.0.7 milestone Apr 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

theme: kotlin An issue related to Kotlin support type: bug A general bug

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants