-
Notifications
You must be signed in to change notification settings - Fork 1.1k
UnsupportedOperationException when scrolling through all entities #5159
Copy link
Copy link
Closed
Description
I have the following repository:
@Repository
public interface MovieRepository extends MongoRepository<Movie, String> {
Window<Movie> findAllBy(Limit limit, ScrollPosition scrollPosition);
}When I attempt to scroll through the results, I get the following exception when I provide a cursor value (I'm accessing the repository via a spring-graphql API):
java.lang.UnsupportedOperationException
at org.springframework.data.mongodb.util.EmptyDocument.put(EmptyDocument.java:41) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.mongodb.core.ScrollUtils$KeysetScrollDirector.createQuery(ScrollUtils.java:193) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.mongodb.core.ScrollUtils.createKeysetPaginationQuery(ScrollUtils.java:60) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.mongodb.core.MongoTemplate.doScroll(MongoTemplate.java:951) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.mongodb.core.ExecutableFindOperationSupport$ExecutableFindSupport.scroll(ExecutableFindOperationSupport.java:164) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.lambda$getExecution$3(AbstractMongoQuery.java:193) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.doExecute(AbstractMongoQuery.java:146) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.mongodb.repository.query.AbstractMongoQuery.execute(AbstractMongoQuery.java:119) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:169) ~[spring-data-commons-4.0.2.jar:4.0.2]
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:158) ~[spring-data-commons-4.0.2.jar:4.0.2]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:167) ~[spring-data-commons-4.0.2.jar:4.0.2]
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:146) ~[spring-data-commons-4.0.2.jar:4.0.2]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-7.0.3.jar:7.0.3]
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:69) ~[spring-data-commons-4.0.2.jar:4.0.2]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-7.0.3.jar:7.0.3]
at org.springframework.data.mongodb.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:130) ~[spring-data-mongodb-5.0.2.jar:5.0.2]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-7.0.3.jar:7.0.3]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:222) ~[spring-aop-7.0.3.jar:7.0.3]
at jdk.proxy2/jdk.proxy2.$Proxy64.findAllBy(Unknown Source) ~[na:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:359) ~[spring-aop-7.0.3.jar:7.0.3]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) ~[spring-aop-7.0.3.jar:7.0.3]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:158) ~[spring-aop-7.0.3.jar:7.0.3]
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:135) ~[spring-tx-7.0.3.jar:7.0.3]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-7.0.3.jar:7.0.3]
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:222) ~[spring-aop-7.0.3.jar:7.0.3]
at jdk.proxy2/jdk.proxy2.$Proxy64.findAllBy(Unknown Source) ~[na:na]
at com.example.controller.MovieController.movies(MovieController.java:24) ~[main/:na]
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:580) ~[na:na]
at org.springframework.graphql.data.method.InvocableHandlerMethodSupport.doInvoke(InvocableHandlerMethodSupport.java:120) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.graphql.data.method.annotation.support.DataFetcherHandlerMethod.validateAndInvoke(DataFetcherHandlerMethod.java:144) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.graphql.data.method.annotation.support.DataFetcherHandlerMethod.invoke(DataFetcherHandlerMethod.java:128) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.graphql.data.method.annotation.support.DataFetcherHandlerMethod.invoke(DataFetcherHandlerMethod.java:107) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.graphql.data.method.annotation.support.AnnotatedControllerConfigurer$SchemaMappingDataFetcher.get(AnnotatedControllerConfigurer.java:522) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.graphql.data.pagination.ConnectionFieldTypeVisitor$ConnectionDataFetcher.get(ConnectionFieldTypeVisitor.java:221) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.graphql.execution.ContextDataFetcherDecorator.lambda$get$0(ContextDataFetcherDecorator.java:92) ~[spring-graphql-2.0.2.jar:2.0.2]
at io.micrometer.context.ContextSnapshot.lambda$wrap$1(ContextSnapshot.java:106) ~[context-propagation-1.2.0.jar:1.2.0]
at org.springframework.graphql.execution.ContextDataFetcherDecorator.get(ContextDataFetcherDecorator.java:92) ~[spring-graphql-2.0.2.jar:2.0.2]
at graphql.execution.ExecutionStrategy.invokeDataFetcher(ExecutionStrategy.java:512) ~[graphql-java-25.0.jar:na]
at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:466) ~[graphql-java-25.0.jar:na]
at graphql.execution.ExecutionStrategy.fetchField(ExecutionStrategy.java:404) ~[graphql-java-25.0.jar:na]
at graphql.execution.ExecutionStrategy.resolveFieldWithInfo(ExecutionStrategy.java:360) ~[graphql-java-25.0.jar:na]
at graphql.execution.ExecutionStrategy.getAsyncFieldValueInfo(ExecutionStrategy.java:325) ~[graphql-java-25.0.jar:na]
at graphql.execution.AsyncExecutionStrategy.execute(AsyncExecutionStrategy.java:58) ~[graphql-java-25.0.jar:na]
at graphql.execution.Execution.executeOperation(Execution.java:220) ~[graphql-java-25.0.jar:na]
at graphql.execution.Execution.execute(Execution.java:139) ~[graphql-java-25.0.jar:na]
at graphql.GraphQL.execute(GraphQL.java:620) ~[graphql-java-25.0.jar:na]
at graphql.GraphQL.lambda$parseValidateAndExecute$5(GraphQL.java:549) ~[graphql-java-25.0.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341) ~[na:na]
at graphql.EngineRunningState.compose(EngineRunningState.java:91) ~[graphql-java-25.0.jar:na]
at graphql.GraphQL.parseValidateAndExecute(GraphQL.java:544) ~[graphql-java-25.0.jar:na]
at graphql.GraphQL.lambda$executeAsync$1(GraphQL.java:504) ~[graphql-java-25.0.jar:na]
at java.base/java.util.concurrent.CompletableFuture.uniComposeStage(CompletableFuture.java:1187) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture.thenCompose(CompletableFuture.java:2341) ~[na:na]
at graphql.EngineRunningState.compose(EngineRunningState.java:91) ~[graphql-java-25.0.jar:na]
at graphql.GraphQL.lambda$executeAsync$2(GraphQL.java:493) ~[graphql-java-25.0.jar:na]
at graphql.EngineRunningState.engineRun(EngineRunningState.java:202) ~[graphql-java-25.0.jar:na]
at graphql.GraphQL.executeAsync(GraphQL.java:485) ~[graphql-java-25.0.jar:na]
at org.springframework.graphql.execution.DefaultExecutionGraphQlService.lambda$execute$0(DefaultExecutionGraphQlService.java:95) ~[spring-graphql-2.0.2.jar:2.0.2]
at reactor.core.publisher.MonoDeferContextual.subscribe(MonoDeferContextual.java:48) ~[reactor-core-3.8.2.jar:3.8.2]
at reactor.core.publisher.Mono.subscribe(Mono.java:4569) ~[reactor-core-3.8.2.jar:3.8.2]
at reactor.core.publisher.Mono.subscribeWith(Mono.java:4634) ~[reactor-core-3.8.2.jar:3.8.2]
at reactor.core.publisher.Mono.toFuture(Mono.java:5146) ~[reactor-core-3.8.2.jar:3.8.2]
at org.springframework.graphql.server.webmvc.GraphQlHttpHandler.prepareResponse(GraphQlHttpHandler.java:119) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.graphql.server.webmvc.AbstractGraphQlHttpHandler.handleRequest(AbstractGraphQlHttpHandler.java:135) ~[spring-graphql-2.0.2.jar:2.0.2]
at org.springframework.web.servlet.function.support.HandlerFunctionAdapter.handle(HandlerFunctionAdapter.java:106) ~[spring-webmvc-7.0.3.jar:7.0.3]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) ~[spring-webmvc-7.0.3.jar:7.0.3]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:866) ~[spring-webmvc-7.0.3.jar:7.0.3]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1003) ~[spring-webmvc-7.0.3.jar:7.0.3]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:903) ~[spring-webmvc-7.0.3.jar:7.0.3]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:649) ~[tomcat-embed-core-11.0.15.jar:6.1]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:874) ~[spring-webmvc-7.0.3.jar:7.0.3]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:710) ~[tomcat-embed-core-11.0.15.jar:6.1]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:128) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-11.0.15.jar:11.0.15]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-7.0.3.jar:7.0.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.3.jar:7.0.3]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-7.0.3.jar:7.0.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.3.jar:7.0.3]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:199) ~[spring-web-7.0.3.jar:7.0.3]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-7.0.3.jar:7.0.3]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:107) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:165) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:77) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:113) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:83) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:72) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:341) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57) ~[tomcat-embed-core-11.0.15.jar:11.0.15]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
The issue seems to be the following in Query:
public Document getQueryObject() {
if (criteria.isEmpty() && restrictedTypes.isEmpty()) {
return BsonUtils.EMPTY_DOCUMENT;
}
...EMPTY_DOCUMENT is immutable, but then in ScrollUtils.createQuery(), it tries to add a sort constraint to this document and it blows up. I'm new to Spring Data, so it's possible I've done something wrong, but this seems like a bug. The request works correctly if I replace EMPTY_DOCUMENT with new Document().
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
type: bugA general bugA general bug