-
-
Notifications
You must be signed in to change notification settings - Fork 76
Closed
Description
Querydsl fails to generate and execute queries inside threads used by Spring to handle requests. The following simple code:
@RestController
@SpringBootApplication
public class TestApplication {
private static final List<Cat> CATS = List.of(new Cat("Felix"), new Cat("Garfield"));
public static void main(final String[] args) {
SpringApplication.run(TestApplication.class, args);
}
@RequestMapping("/")
public List<Cat> home() {
return CollQueryFactory.from(QCat.cat, CATS)
.where(QCat.cat.name.eq("Garfield"))
.stream()
.toList();
}
}produces this error:
2025-01-29T09:42:03.822+01:00 ERROR 1190827 --- [test] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.querydsl.codegen.utils.CodegenException: Compilation of public class Q_252532505_1275614662_1275614662_1195259493 {
public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
for (com.example.Cat cat : cat_) {
try {
if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
rv.add(cat);
}
} catch (NullPointerException npe) { }
}
return rv; }
}
failed.
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
^
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
^
/Q_252532505_1275614662_1275614662_1195259493.java:5: error: package com.example does not exist
for (com.example.Cat cat : cat_) {
^
/Q_252532505_1275614662_1275614662_1195259493.java:7: error: package com.querydsl.collections does not exist
if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
^
6 errors
] with root cause
com.querydsl.codegen.utils.CodegenException: Compilation of public class Q_252532505_1275614662_1275614662_1195259493 {
public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
for (com.example.Cat cat : cat_) {
try {
if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
rv.add(cat);
}
} catch (NullPointerException npe) { }
}
return rv; }
}
failed.
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
^
/Q_252532505_1275614662_1275614662_1195259493.java:3: error: package com.example does not exist
public static Iterable<com.example.Cat> eval(Iterable<com.example.Cat> cat_, String a1) {
^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
^
/Q_252532505_1275614662_1275614662_1195259493.java:4: error: package com.example does not exist
java.util.List<com.example.Cat> rv = new java.util.ArrayList<com.example.Cat>();
^
/Q_252532505_1275614662_1275614662_1195259493.java:5: error: package com.example does not exist
for (com.example.Cat cat : cat_) {
^
/Q_252532505_1275614662_1275614662_1195259493.java:7: error: package com.querydsl.collections does not exist
if (com.querydsl.collections.CollQueryFunctions.equals(cat.getName(), a1)) {
^
6 errors
at com.querydsl.codegen.utils.JDKEvaluatorFactory.compile(JDKEvaluatorFactory.java:83) ~[querydsl-codegen-utils-6.10.1.jar:na]
at com.querydsl.codegen.utils.AbstractEvaluatorFactory.createEvaluator(AbstractEvaluatorFactory.java:146) ~[querydsl-codegen-utils-6.10.1.jar:na]
at com.querydsl.collections.DefaultEvaluatorFactory.createEvaluator(DefaultEvaluatorFactory.java:164) ~[querydsl-collections-6.10.1.jar:na]
at com.querydsl.collections.DefaultQueryEngine.evaluateSingleSource(DefaultQueryEngine.java:175) ~[querydsl-collections-6.10.1.jar:na]
at com.querydsl.collections.DefaultQueryEngine.list(DefaultQueryEngine.java:89) ~[querydsl-collections-6.10.1.jar:na]
at com.querydsl.collections.AbstractCollQuery.fetch(AbstractCollQuery.java:195) ~[querydsl-collections-6.10.1.jar:na]
at com.querydsl.collections.AbstractCollQuery.stream(AbstractCollQuery.java:188) ~[querydsl-collections-6.10.1.jar:na]
at com.example.TestApplication.home(TestApplication.java:29) ~[classes/: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.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:257) ~[spring-web-6.2.2.jar:6.2.2]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:190) ~[spring-web-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:986) ~[spring-webmvc-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:891) ~[spring-webmvc-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1088) ~[spring-webmvc-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:978) ~[spring-webmvc-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014) ~[spring-webmvc-6.2.2.jar:6.2.2]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903) ~[spring-webmvc-6.2.2.jar:6.2.2]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564) ~[tomcat-embed-core-10.1.34.jar:6.0]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:885) ~[spring-webmvc-6.2.2.jar:6.2.2]
at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658) ~[tomcat-embed-core-10.1.34.jar:6.0]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:195) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-10.1.34.jar:10.1.34]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.2.2.jar:6.2.2]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.2.jar:6.2.2]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-6.2.2.jar:6.2.2]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.2.jar:6.2.2]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-6.2.2.jar:6.2.2]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:116) ~[spring-web-6.2.2.jar:6.2.2]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:164) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:140) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:483) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:397) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:905) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1741) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1190) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[tomcat-embed-core-10.1.34.jar:10.1.34]
at java.base/java.lang.Thread.run(Thread.java:1583) ~[na:na]
I found one workaround that seems to fix the issue. That is to run a dummy query in the main thread at the startup of the application. If I modify the main method like this then the issue goes away.
public static void main(final String[] args) {
SpringApplication.run(TestApplication.class, args);
CollQueryFactory.from(QCat.cat, CATS)
.where(QCat.cat.name.eq("Garfield"))
.stream()
.toList();
}I'm not sure what the issue is, but the workaround I found seems to indicate that this has something to do with threads and possible classpaths and classloaders.
Here is a repository that contains the minimal code required to reproduce this bug: https://github.com/rnilss47/querydsl-reproduce-collections-bug.
Metadata
Metadata
Assignees
Labels
No labels