Spring Boot 2 - servlet not properly initialized
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 3/5
- 見積もり時間
- 1〜2日
- 初心者へのやさしさ
- 35/100
- issue の種類
- バグ
- 明瞭さ
- 明確に書かれている
- 活発さ
- 停滞
- 技術スタック
- aws, java, spring-boot
調査の方向性
aws-serverless-java-container-core/src/main/java/com/amazonaws/serverless/proxy/internal/servlet/FilterChainManager.java の、issue で説明されている ServletExecutionFilter のチェックから始めます。その動作を GenericServlet#getServletInfo および CamelHttpTransportServlet の初期化と比較し、その後 Apache Camel の route シナリオを再現します。サーブレットが初期化され、POST /test エンドポイントが 404 ではなく 200 を返せば完了です。
索引モデルが issue の本文から書いたものです。
説明
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<CamelHttpTransportServlet> servletRegistrationBean() {
ServletRegistrationBean<CamelHttpTransportServlet> 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 from ServletExecutionFilter.
By default, getServletInfo() returns an empty string, 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 and the consumer 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;
}
}
- 主要言語
- Java
- スター
- 1.6k
- フォーク
- 575
- 平均マージ
- 1日 15時間
- マージ済み PR(30日)
- 12
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
aws/serverless-java-container のほかの issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 72/100
aws/serverless-java-container#1729 ·
メンテナーはふだん 1 日以内に返信
-
難易度 1/5 1時間未満 初心者へのやさしさ 88/100
aws/serverless-java-container#1715 ·
メンテナーはふだん 1 日以内に返信
-
Support for API Gateway mTLS clientCert field対応中かも @2748109647 が 10 日前に担当しました。 オープン
難易度 2/5 1〜3時間 初心者へのやさしさ 48/100
aws/serverless-java-container#1726 ·
メンテナーはふだん 1 日以内に返信
-
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
aws/serverless-java-container#1579 · コメント 3 件 · リアクション 1 件 ·
メンテナーはふだん 1 日以内に返信
-
難易度 3/5 1〜2日 初心者へのやさしさ 42/100
aws/serverless-java-container#1568 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
aws/serverless-java-container の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
ls1intum/thesis-management#1473 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
LunaDeerMC/Dominion#301 · コメント 1 件 ·
-
[FEATURE] Expose external refresh, node-level translog and warmer stats対応中かも このイシューにリンクされたプルリクエストがオープン中、またはマージ済みです。 オープンuntriaged
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
opensearch-project/opensearch-prometheus-exporter#680 ·
メンテナーはふだん 2 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100