aws / aws/serverless-java-container

Spring Boot 2 - servlet not properly initialized

Đang mở
#406 2 bình luận 0 reaction 0 người được giao Xem trên GitHub
need feedback
Ngôn ngữ chính
Java
Star
1.6k
Fork
574
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

*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;
}
}
```

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Start in aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java at the ServletExecutionFilter check described in the issue. Compare that behavior with GenericServlet#getServletInfo and CamelHttpTransportServlet initialization, then reproduce the Apache Camel route scenario. Done means the servlet initializes and the POST /test endpoint returns 200 instead of 404.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
aws, java, spring-boot
Lĩnh vực
api, backend
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Đặc tả rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.