We have a spring boot service (spring boot starter parent 3.0.5) which we are attempting to convert to run on GraalVM with Spring native mvn -Pnative spring-boot:build-image
.
The app exposes a simple endpoint to receive the current authenticated user details:
@GetMapping(value = ["/user/"])
open fun user(@AuthenticationPrincipal principalMono: Mono<Principal>): Mono<UserDto> {
return principalMono.flatMap { principal ->
fetchUser(principal)
}
}
When run docker run --rm -p 8443:8443 docker.io/library/portal:0.0.1-SNAPSHOT
, we receive InvalidClassException when the principalMono is subscribed to. In the snippet above, fetchUser is never invoked.
org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?
at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:78) ~[na:na]
Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException:
Error has been observed at the following site(s):
*__checkpoint ? Handler ****.UserController#user(Mono) [DispatcherHandler]
*__checkpoint ? ****.SecurityConfig$$Lambda$a1dc3049c6661b22f48d18eef8067c24d6e398ea [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.authorization.AuthorizationWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.authentication.logout.LogoutWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.savedrequest.ServerRequestCacheWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.context.SecurityContextServerWebExchangeWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.oauth2.client.web.server.authentication.OAuth2LoginAuthenticationWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.authentication.AuthenticationWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.oauth2.client.web.server.OAuth2AuthorizationRequestRedirectWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.context.ReactorContextWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.csrf.CsrfWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.header.HttpHeaderWriterWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.config.web.server.ServerHttpSecurity$ServerWebExchangeReactorContextWebFilter [DefaultWebFilterChain]
*__checkpoint ? org.springframework.security.web.server.WebFilterChainProxy [DefaultWebFilterChain]
*__checkpoint ? HTTP GET "/api/user/" [ExceptionHandlingWebHandler]
Original Stack Trace:
at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:78) ~[na:na]
at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:36) ~[na:na]
at org.springframework.session.data.mongo.JdkMongoSessionConverter.deserializeAttributes(JdkMongoSessionConverter.java:165) ~[na:na]
at org.springframework.session.data.mongo.JdkMongoSessionConverter.convert(JdkMongoSessionConverter.java:140) ~[na:na]
at org.springframework.session.data.mongo.AbstractMongoSessionConverter.convert(AbstractMongoSessionConverter.java:115) ~[****.ApplicationKt:3.0.1]
at org.springframework.session.data.mongo.MongoSessionUtils.convertToSession(MongoSessionUtils.java:45) ~[na:na]
at org.springframework.session.data.mongo.ReactiveMongoSessionRepository.lambda$findById$2(ReactiveMongoSessionRepository.java:128) ~[****.ApplicationKt:3.0.1]
at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:208) ~[na:na]
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[na:na]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.BatchCursorPublisher.lambda$first$0(BatchCursorPublisher.java:114) ~[****.ApplicationKt:na]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:171) ~[na:na]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[na:na]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[na:na]
at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$31(MongoOperationPublisher.java:577) ~[na:na]
at com.mongodb.internal.operation.AsyncQueryBatchCursor.next(AsyncQueryBatchCursor.java:173) ~[na:na]
at com.mongodb.reactivestreams.client.internal.BatchCursor.lambda$next$0(BatchCursor.java:38) ~[na:na]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58) ~[na:na]
at reactor.core.publisher.Mono.subscribe(Mono.java:4485) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.Mono.subscribeWith(Mono.java:4551) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.Mono.subscribe(Mono.java:4313) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.BatchCursorPublisher.lambda$first$1(BatchCursorPublisher.java:118) ~[****.ApplicationKt:na]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58) ~[na:na]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) ~[na:na]
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[na:na]
at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$31(MongoOperationPublisher.java:577) ~[na:na]
at com.mongodb.reactivestreams.client.internal.OperationExecutorImpl.lambda$execute$2(OperationExecutorImpl.java:94) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[****.ApplicationKt:na]
at com.mongodb.internal.async.function.RetryingAsyncCallbackSupplier$RetryingCallback.onResult(RetryingAsyncCallbackSupplier.java:116) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[****.ApplicationKt:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[****.ApplicationKt:na]
at com.mongodb.internal.operation.FindOperation$1.onResult(FindOperation.java:379) ~[na:na]
at com.mongodb.internal.operation.CommandOperationHelper.lambda$transformingReadCallback$10(CommandOperationHelper.java:332) ~[****.ApplicationKt:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.connection.LoadBalancedServer$LoadBalancedServerProtocolExecutor.lambda$executeAsync$0(LoadBalancedServer.java:185) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.connection.CommandProtocolImpl$1.onResult(CommandProtocolImpl.java:84) ~[na:na]
at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection$1.onResult(DefaultConnectionPool.java:683) ~[na:na]
at com.mongodb.internal.connection.UsageTrackingInternalConnection$2.onResult(UsageTrackingInternalConnection.java:159) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:524) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:501) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:824) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:788) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:648) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:645) ~[na:na]
at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:250) ~[na:na]
at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:233) ~[na:na]
at com.mongodb.internal.connection.tlschannel.async.AsynchronousTlsChannel.lambda$read$4(AsynchronousTlsChannel.java:122) ~[na:na]
at java.base@17.0.6/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base@17.0.6/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base@17.0.6/java.lang.Thread.run(Thread.java:833) ~[****.ApplicationKt:na]
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775) ~[****.ApplicationKt:na]
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203) ~[na:na]
Caused by: java.io.InvalidClassException: java.util.HashMap; no valid constructor
at java.base@17.0.6/java.io.ObjectStreamClass$ExceptionInfo.newInvalidClassException(ObjectStreamClass.java:172) ~[na:na]
at java.base@17.0.6/java.io.ObjectStreamClass.checkDeserialize(ObjectStreamClass.java:790) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2225) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1733) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.io.ObjectInputStream.readObject(ObjectInputStream.java:509) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.io.ObjectInputStream.readObject(ObjectInputStream.java:467) ~[****.ApplicationKt:na]
at org.springframework.core.serializer.DefaultDeserializer.deserialize(DefaultDeserializer.java:71) ~[na:na]
at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:73) ~[na:na]
at org.springframework.core.serializer.support.DeserializingConverter.convert(DeserializingConverter.java:36) ~[na:na]
at org.springframework.session.data.mongo.JdkMongoSessionConverter.deserializeAttributes(JdkMongoSessionConverter.java:165) ~[na:na]
at org.springframework.session.data.mongo.JdkMongoSessionConverter.convert(JdkMongoSessionConverter.java:140) ~[na:na]
at org.springframework.session.data.mongo.AbstractMongoSessionConverter.convert(AbstractMongoSessionConverter.java:115) ~[****.ApplicationKt:3.0.1]
at org.springframework.session.data.mongo.MongoSessionUtils.convertToSession(MongoSessionUtils.java:45) ~[na:na]
at org.springframework.session.data.mongo.ReactiveMongoSessionRepository.lambda$findById$2(ReactiveMongoSessionRepository.java:128) ~[****.ApplicationKt:3.0.1]
at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onNext(FluxMap.java:208) ~[na:na]
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) ~[na:na]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:158) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.BatchCursorPublisher.lambda$first$0(BatchCursorPublisher.java:114) ~[****.ApplicationKt:na]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:171) ~[na:na]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[na:na]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[na:na]
at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$31(MongoOperationPublisher.java:577) ~[na:na]
at com.mongodb.internal.operation.AsyncQueryBatchCursor.next(AsyncQueryBatchCursor.java:173) ~[na:na]
at com.mongodb.reactivestreams.client.internal.BatchCursor.lambda$next$0(BatchCursor.java:38) ~[na:na]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58) ~[na:na]
at reactor.core.publisher.Mono.subscribe(Mono.java:4485) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.Mono.subscribeWith(Mono.java:4551) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.Mono.subscribe(Mono.java:4313) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.BatchCursorPublisher.lambda$first$1(BatchCursorPublisher.java:118) ~[****.ApplicationKt:na]
at reactor.core.publisher.MonoCreate.subscribe(MonoCreate.java:58) ~[na:na]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:165) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:122) ~[na:na]
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:82) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:245) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:305) ~[****.ApplicationKt:3.5.4]
at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) ~[na:na]
at reactor.core.publisher.MonoCreate$DefaultMonoSink.success(MonoCreate.java:172) ~[****.ApplicationKt:3.5.4]
at com.mongodb.reactivestreams.client.internal.MongoOperationPublisher.lambda$sinkToCallback$31(MongoOperationPublisher.java:577) ~[na:na]
at com.mongodb.reactivestreams.client.internal.OperationExecutorImpl.lambda$execute$2(OperationExecutorImpl.java:94) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[****.ApplicationKt:na]
at com.mongodb.internal.async.function.RetryingAsyncCallbackSupplier$RetryingCallback.onResult(RetryingAsyncCallbackSupplier.java:116) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[****.ApplicationKt:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.async.function.AsyncCallbackSupplier.lambda$whenComplete$1(AsyncCallbackSupplier.java:97) ~[****.ApplicationKt:na]
at com.mongodb.internal.operation.FindOperation$1.onResult(FindOperation.java:379) ~[na:na]
at com.mongodb.internal.operation.CommandOperationHelper.lambda$transformingReadCallback$10(CommandOperationHelper.java:332) ~[****.ApplicationKt:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.connection.LoadBalancedServer$LoadBalancedServerProtocolExecutor.lambda$executeAsync$0(LoadBalancedServer.java:185) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.connection.CommandProtocolImpl$1.onResult(CommandProtocolImpl.java:84) ~[na:na]
at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection$1.onResult(DefaultConnectionPool.java:683) ~[na:na]
at com.mongodb.internal.connection.UsageTrackingInternalConnection$2.onResult(UsageTrackingInternalConnection.java:159) ~[na:na]
at com.mongodb.internal.async.ErrorHandlingResultCallback.onResult(ErrorHandlingResultCallback.java:46) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:524) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$2$1.onResult(InternalStreamConnection.java:501) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:824) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$MessageHeaderCallback$MessageCallback.onResult(InternalStreamConnection.java:788) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:648) ~[na:na]
at com.mongodb.internal.connection.InternalStreamConnection$5.completed(InternalStreamConnection.java:645) ~[na:na]
at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:250) ~[na:na]
at com.mongodb.internal.connection.AsynchronousChannelStream$BasicCompletionHandler.completed(AsynchronousChannelStream.java:233) ~[na:na]
at com.mongodb.internal.connection.tlschannel.async.AsynchronousTlsChannel.lambda$read$4(AsynchronousTlsChannel.java:122) ~[na:na]
at java.base@17.0.6/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
at java.base@17.0.6/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[****.ApplicationKt:na]
at java.base@17.0.6/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
at java.base@17.0.6/java.lang.Thread.run(Thread.java:833) ~[****.ApplicationKt:na]
at com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:775) ~[****.ApplicationKt:na]
at com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:203) ~[na:na]
- We attempted to remove the injection of Mono with @AuthenticationPrincipal and replace it with an inline invocation of
ReactiveSecurityContextHolder.getContext()
. However this led to the same exception (at the point that the reactive security context is subscribed to). - Taking spring security out of the equation and removing the subscription to the authentication principal (hard-coding a reference to a user record in MongoDb) allows the endpoint to work fine (hence it does indeed appear to be the subscription to the principal that is the issue).
- Various Native Runtime Hints have been registered as experiments (using RuntimeHintsRegistrar). These include
hints.serialization().registerType(OAuth2AuthenticationToken::class.java)
- I wouldn't have expected a need to register a serialization hint for "java.util.HashMap", but as an experiment this was done. However, this resulted in:
java.io.InvalidClassException: java.util.HashMap; local class incompatible: stream classdesc serialVersionUID = -3563561681480877083, local class serialVersionUID = 362498820763181265
My understanding from the documentation is that Sprint Native is fully implemented for Spring Security (including reactive)? Any thoughts or suggestions would be very much appreciated.
Update 23 June 2023
Migrated to spring boot starter parent 3.1.1, but still the same behaviour as above.
We also, attempted to subscribe to the principal Mono retured via the ServerWebExchange. But this again leads to Caused by: java.io.InvalidClassException: java.util.HashMap; no valid constructor
@GetMapping(value = ["/user/"])
open fun user(exchange: ServerWebExchange): Mono<UserDto> {
return exchange.getPrincipal<Principal>() { principal ->
fetchUser(principal)
}
}
Any thoughts would be much appreciated!