aws / aws/serverless-java-container
Spring Boot 2 - servlet not properly initialized
- Lingua principale
- Java
- Stelle
- 1.6k
- Fork
- 574
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Descrizione
*Serverless Java Container version*: 1.5.2
*Implementations:* Spring Boot 2
*Framework version:* Spring Boot 2.4.4
*Frontend service:* REST API using Apache Camel
*Deployment method:* Console
## Scenario
Trying to test a simple `/test` REST endpoint served by Apache Camel.
## Expected behavior
The `/test` should return a status code of 200 and the expected result.
## Actual behavior
The endpoint returns a 404.
## Steps to reproduce
Configure a simple Spring Boot 2 app with Apache Camel and define a route for it.
Example servlet config:
```
@Bean
ServletRegistrationBean servletRegistrationBean() {
ServletRegistrationBean servlet =
new ServletRegistrationBean<>(new CamelHttpTransportServlet(), "/*");
servlet.setName("CamelServlet");
return servlet;
}
```
Example route:
```
@Override
public void configure() throws Exception {
rest("/")
.produces("application/json")
.post("test")
.route()
.bean(new Test())
.endRest();
}
```
## Full log output
```
2021-03-23T17:37:03.821+02:00 START RequestId: 6d29b2b7-ac66-4e9d-a199-32f15d7cf084 Version: $LATEST
2021-03-23T17:37:05.330+02:00 15:37:03.814 [main] INFO com.amazonaws.serverless.proxy.internal.LambdaContainerHandler - Starting Lambda Container Handler
2021-03-23T17:37:05.330+02:00 . ____ _ __ _ _
2021-03-23T17:37:05.331+02:00 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
2021-03-23T17:37:05.331+02:00 ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
2021-03-23T17:37:05.331+02:00 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
2021-03-23T17:37:05.331+02:00 ' |____| .__|_| |_|_| |_\__, | / / / /
2021-03-23T17:37:05.344+02:00 =========|_|==============|___/=/_/_/_/
2021-03-23T17:37:05.723+02:00 :: Spring Boot ::
2021-03-23T17:37:05.724+02:00 2021-03-23 15:37:05.717 INFO 8 --- [ main] lambdainternal.AWSLambda : Starting AWSLambda using Java 11.0.9.1 on 169.254.168.21 with PID 8 (/var/runtime/lib/aws-lambda-java-runtime-0.2.0.jar started by sbx_user1051 in /var/task)
2021-03-23T17:37:08.325+02:00 2021-03-23 15:37:05.724 INFO 8 --- [ main] lambdainternal.AWSLambda : No active profile set, falling back to default profiles: default
2021-03-23T17:37:08.326+02:00 2021-03-23 15:37:08.325 INFO 8 --- [ main] c.a.s.p.i.servlet.AwsServletContext : Initializing Spring embedded WebApplicationContext
2021-03-23T17:37:09.349+02:00 2021-03-23 15:37:08.325 INFO 8 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2458 ms
2021-03-23T17:37:11.867+02:00 2021-03-23 15:37:09.349 INFO 8 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-03-23T17:37:11.890+02:00 2021-03-23 15:37:11.867 INFO 8 --- [ main] c.s.b.CamelSpringBootApplicationListener : Starting CamelMainRunController to ensure the main thread keeps running
2021-03-23T17:37:11.890+02:00 2021-03-23 15:37:11.885 INFO 8 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Routes startup summary (total:1 started:1)
2021-03-23T17:37:11.890+02:00 2021-03-23 15:37:11.890 INFO 8 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Started route1 (rest://post:/:test)
2021-03-23T17:37:11.910+02:00 2021-03-23 15:37:11.890 INFO 8 --- [ main] o.a.c.impl.engine.AbstractCamelContext : Apache Camel 3.8.0 (camel-1) started in 707ms (build:82ms init:588ms start:37ms)
2021-03-23T17:37:11.931+02:00 2021-03-23 15:37:11.910 INFO 8 --- [ main] lambdainternal.AWSLambda : Started AWSLambda in 7.494 seconds (JVM running for 8.904)
2021-03-23T17:37:11.931+02:00 2021-03-23 15:37:11.930 INFO 8 --- [ main] c.a.s.p.i.servlet.AwsServletContext : Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-03-23T17:37:11.932+02:00 2021-03-23 15:37:11.931 INFO 8 --- [ main] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2021-03-23T17:37:11.932+02:00 2021-03-23 15:37:11.932 INFO 8 --- [ main] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2021-03-23T17:37:52.051+02:00 START RequestId: ee55b2df-c918-40e6-8bf0-fd98f7c76c70 Version: $LATEST
2021-03-23T17:37:52.305+02:00 2021-03-23 15:37:52.304 INFO 8 --- [ main] c.a.s.p.internal.LambdaContainerHandler : 127.0.0.1 null- null [09/04/2015:12:34:56Z] "POST /test HTTP/1.1" 404 - "-" "Custom User Agent String" combined
2021-03-23T17:37:52.306+02:00 END RequestId: ee55b2df-c918-40e6-8bf0-fd98f7c76c70
2021-03-23T17:37:52.306+02:00 REPORT RequestId: ee55b2df-c918-40e6-8bf0-fd98f7c76c70 Duration: 244.04 ms Billed Duration: 245 ms Memory Size: 512 MB Max Memory Used: 215 MB
```
## Implementation details
The problem is caused by [this check](https://github.com/awslabs/aws-serverless-java-container/blob/5bfacf247dabdb100336beb523d2a8fd5c8b487a/aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java#L338) from `ServletExecutionFilter`.
By default, `getServletInfo()` returns an [empty string](https://github.com/javaee/servlet-spec/blob/master/src/main/java/javax/servlet/GenericServlet.java#L178), not `null`. The servlet used by Apache Camel, `CamelHttpTransportServlet`, does not override that method.
Because of this, `ServletExecutionFilter` thinks that the servlet is already initialized and it never calls its `init()` method. Consequently, the servlet resolve strategy is [not initialized](https://github.com/apache/camel/blob/7da8bb4e66d00eccccc5424f2685d06841c6c742/components/camel-servlet/src/main/java/org/apache/camel/component/servlet/CamelHttpTransportServlet.java#L47) and the [consumer](https://github.com/apache/camel/blob/7da8bb4e66d00eccccc5424f2685d06841c6c742/components/camel-http-common/src/main/java/org/apache/camel/http/common/CamelServlet.java#L212) for a specific request is never found.
## Workaround
This can be worked around by overriding the `getServletInfo()` method:
```
public class CustomCamelHttpTransportServlet extends CamelHttpTransportServlet {
@Override
public String getServletInfo() {
return null;
}
}
```
Guida per i contributori
Apri la guida per i contributori
Valutazione
Questa issue non è ancora stata valutata.