Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Spring Native doesn't work with Spring Gateway: java.lang.IllegalStateException: Incompatible Tomcat implementation #3358

Open
jaro-sagan opened this issue Apr 17, 2024 · 2 comments

Comments

@jaro-sagan
Copy link

Describe the bug
SpringBoot: 3.1.10
SpringCloud: 2022.0.5
I have encountered an issue with Spring Native and Spring Gateway. After building a native image and running it, I get the following error:

2024-04-17T06:59:44.327Z ERROR 1 --- [nio-8090-exec-1] o.a.c.c.C.[.[.[/].[httpHandlerServlet]   : Servlet.service() for servlet [httpHandlerServlet] in context with path [] threw exception [Servlet execution threw an exception] with root cause

java.lang.IllegalStateException: Incompatible Tomcat implementation
        at org.springframework.util.Assert.state(Assert.java:76) ~[na:na]
        at org.springframework.http.server.reactive.TomcatHttpHandlerAdapter$TomcatServerHttpRequest.<clinit>(TomcatHttpHandlerAdapter.java:90) ~[na:na]
        at org.springframework.http.server.reactive.TomcatHttpHandlerAdapter.createRequest(TomcatHttpHandlerAdapter.java:67) ~[com.example.nativedemo.NativeDemoApplication:6.0.18]
        at org.springframework.http.server.reactive.ServletHttpHandlerAdapter.service(ServletHttpHandlerAdapter.java:172) ~[com.example.nativedemo.NativeDemoApplication:6.0.18]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[na:na]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[na:na]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[na:na]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[na:na]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[na:na]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[na:na]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[na:na]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[na:na]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[na:na]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[na:na]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[na:na]
        at java.base@17.0.10/java.lang.Thread.run(Thread.java:840) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:838) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211) ~[na:na]

2024-04-17T06:59:44.328Z ERROR 1 --- [nio-8090-exec-1] o.a.coyote.http11.Http11NioProtocol      : Error reading request, ignored

java.lang.IllegalStateException: Calling [asyncPostProcess()] is not valid for a request with Async state [MUST_ERROR]
        at org.apache.coyote.AsyncStateMachine.asyncPostProcess(AsyncStateMachine.java:302) ~[na:na]
        at org.apache.coyote.AbstractProcessor.asyncPostProcess(AbstractProcessor.java:197) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:83) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[na:na]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[na:na]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[na:na]
        at java.base@17.0.10/java.lang.Thread.run(Thread.java:840) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:838) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211) ~[na:na]

2024-04-17T06:59:44.329Z  INFO 1 --- [nio-8090-exec-1] o.a.catalina.connector.CoyoteAdapter     : Encountered a non-recycled request and recycled it forcedly.

org.apache.catalina.connector.CoyoteAdapter$RecycleRequiredException: null
        at org.apache.catalina.connector.CoyoteAdapter.checkRecycled(CoyoteAdapter.java:522) ~[na:na]
        at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1416) ~[na:na]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1085) ~[na:na]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1060) ~[na:na]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[na:na]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[na:na]
        at java.base@17.0.10/java.lang.Thread.run(Thread.java:840) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:838) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211) ~[na:na]

2024-04-17T06:59:45.426Z ERROR 1 --- [nio-8090-exec-2] o.a.c.c.C.[.[.[/].[httpHandlerServlet]   : Servlet.service() for servlet [httpHandlerServlet] in context with path [] threw exception [Servlet execution threw an exception] with root cause

java.lang.NoClassDefFoundError: Could not initialize class org.springframework.http.server.reactive.TomcatHttpHandlerAdapter$TomcatServerHttpRequest
        at org.springframework.http.server.reactive.TomcatHttpHandlerAdapter.createRequest(TomcatHttpHandlerAdapter.java:67) ~[com.example.nativedemo.NativeDemoApplication:6.0.18]
        at org.springframework.http.server.reactive.ServletHttpHandlerAdapter.service(ServletHttpHandlerAdapter.java:172) ~[com.example.nativedemo.NativeDemoApplication:6.0.18]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205) ~[na:na]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174) ~[na:na]
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149) ~[na:na]
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167) ~[na:na]
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[na:na]
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115) ~[na:na]
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[na:na]
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344) ~[na:na]
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391) ~[na:na]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[na:na]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[na:na]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[na:na]
        at java.base@17.0.10/java.lang.Thread.run(Thread.java:840) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:838) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211) ~[na:na]

2024-04-17T06:59:45.428Z ERROR 1 --- [nio-8090-exec-2] o.a.coyote.http11.Http11NioProtocol      : Error reading request, ignored

java.lang.IllegalStateException: Calling [asyncPostProcess()] is not valid for a request with Async state [MUST_ERROR]
        at org.apache.coyote.AsyncStateMachine.asyncPostProcess(AsyncStateMachine.java:302) ~[na:na]
        at org.apache.coyote.AbstractProcessor.asyncPostProcess(AbstractProcessor.java:197) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:83) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896) ~[na:na]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[na:na]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[na:na]
        at java.base@17.0.10/java.lang.Thread.run(Thread.java:840) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:838) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211) ~[na:na]

2024-04-17T06:59:45.428Z  INFO 1 --- [nio-8090-exec-2] o.a.catalina.connector.CoyoteAdapter     : Encountered a non-recycled request and recycled it forcedly.

org.apache.catalina.connector.CoyoteAdapter$RecycleRequiredException: null
        at org.apache.catalina.connector.CoyoteAdapter.checkRecycled(CoyoteAdapter.java:522) ~[na:na]
        at org.apache.coyote.http11.Http11Processor.recycle(Http11Processor.java:1416) ~[na:na]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.release(AbstractProtocol.java:1085) ~[na:na]
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:1060) ~[na:na]
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1744) ~[na:na]
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[com.example.nativedemo.NativeDemoApplication:10.1.19]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[na:na]
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[na:na]
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63) ~[na:na]
        at java.base@17.0.10/java.lang.Thread.run(Thread.java:840) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.thread.PlatformThreads.threadStartRoutine(PlatformThreads.java:838) ~[com.example.nativedemo.NativeDemoApplication:na]
        at org.graalvm.nativeimage.builder/com.oracle.svm.core.posix.thread.PosixPlatformThreads.pthreadStartRoutine(PosixPlatformThreads.java:211) ~[na:na]

Sample
I have created a sample project that has the same issue, see showcase project

@jaro-sagan
Copy link
Author

jaro-sagan commented Apr 24, 2024

I made it to work by using the tracing agent. Still, I tough that such a simple case would work out of the box.

@jaro-sagan
Copy link
Author

In the end it is enough to just add these two classes to the reflect-config.json

{
  "name": "org.apache.catalina.connector.RequestFacade",
  "allDeclaredFields": true
},
{
  "name": "org.apache.catalina.connector.ResponseFacade",
  "allDeclaredFields": true
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant