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
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status: waiting-for-triage An issue we've not yet triaged or decided on

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants