【エラー解決方法】重大: パス [/xxx] を持つコンテキスト内のサーブレット [dispatcherServlet] のServlet.service() が例外

こんにちは。飯塚です。
 
最近、後輩からJava、Tomcat、Maven構成のプロジェクトのエラーについて質問されました。サクッと解決できず結局2時間ぐらいかかったので、整理のためにまとめました。同様のエラーで悩む方の参考になれば幸いです。

エラー再現環境

項目 詳細
OS Windows 11
言語 Java 11
IDE Eclipse 2023-12 (4.30.0)
プロジェクト管理ツール Maven

エラー内容:「重大: パス [/xxx] を持つコンテキスト内のサーブレット [dispatcherServlet] のServlet.service() が例外」

Mavenを使ったJavaのWebAPIプロジェクトをTomcatで起動すると下記のエラーが発生しました。プロジェクトのクリーン、Maven installなどを実行しても解消しませんでした。

重大: パス [/xxx] を持つコンテキスト内のサーブレット [dispatcherServlet] のServlet.service() が例外 [Request processing failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: env_local] Unable to build Hibernate SessionFactory] が根本的要因と共に投げられました

なぜかEclipseのコンソール上に、例外の詳細ログが出力されていなかったのが、時間がかかったポイントでした。

原因調査の方針:例外の原因をログ出力させる。

エラーの原因を調べるために、ログ出力の設定を変更する方針で進めます。
 
まず、Tomcatのログ設定ファイル「logging.properties」のログ出力設定がコメントアウトされていないことを確認します。私はEclipse All in Oneに入っているTomcatを使っているので下記にありました。
 
pleiades\2023-12\tomcat\9\conf\logging.properties

「logging.properties」の各プロパティはデフォルトで有効になっていたので変えていませんが、参考までに貼っておきます。不要な方は読み飛ばしてください。
 
logging.properties

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, 3manager.org.apache.juli.AsyncFileHandler, 4host-manager.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################

1catalina.org.apache.juli.AsyncFileHandler.level = FINE
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90
1catalina.org.apache.juli.AsyncFileHandler.encoding = UTF-8

2localhost.org.apache.juli.AsyncFileHandler.level = FINE
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90
2localhost.org.apache.juli.AsyncFileHandler.encoding = UTF-8

3manager.org.apache.juli.AsyncFileHandler.level = FINE
3manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.AsyncFileHandler.prefix = manager.
3manager.org.apache.juli.AsyncFileHandler.maxDays = 90
3manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

4host-manager.org.apache.juli.AsyncFileHandler.level = FINE
4host-manager.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.AsyncFileHandler.prefix = host-manager.
4host-manager.org.apache.juli.AsyncFileHandler.maxDays = 90
4host-manager.org.apache.juli.AsyncFileHandler.encoding = UTF-8

java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = org.apache.juli.OneLineFormatter
java.util.logging.ConsoleHandler.encoding = UTF-8


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.AsyncFileHandler

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.AsyncFileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = FINE

# To see debug messages in TldLocationsCache, uncomment the following line:
#org.apache.jasper.compiler.TldLocationsCache.level = FINE

# To see debug messages for HTTP/2 handling, uncomment the following line:
#org.apache.coyote.http2.level = FINE

# To see debug messages for WebSocket handling, uncomment the following line:
#org.apache.tomcat.websocket.level = FINE

次にEclipseの実行構成を開きます。

起動引数に、logging.propertiesを読み込むように設定しましょう。引数を追加したら、「適用」し「実行」します。
 
起動引数に追加する内容
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djava.util.logging.config.file="【Tomcatのパス】\tomcat\9\conf\logging.properties"


実行すると起動引数の「-Dcatalina.base」で指定されているパスに「localhost.yyyy-MM-dd.log」という名称でログファイルが作成されていることが分かります。
 
【プロジェクトのワークスペース】\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\logs\localhost.yyyy-MM-dd.log

エラーの原因と解決方法

「localhost.yyyy-MM-dd.log」のログファイルを開くと下記のように出力されていました。「Duplicate property mapping of name found in xxx.XXXEntity」なので、Entityのカラム名の重複を修正すれば解消です。

05-Oct-2024 14:20:32.544 情報 [main] org.apache.catalina.core.ApplicationContext.log No Spring WebApplicationInitializer types detected on classpath
05-Oct-2024 14:20:32.582 情報 [main] org.apache.catalina.core.ApplicationContext.log Initializing Spring root WebApplicationContext
05-Oct-2024 14:20:34.036 情報 [main] org.apache.catalina.core.ApplicationContext.log Initializing Spring DispatcherServlet 'dispatcherServlet'
05-Oct-2024 14:21:50.116 重大 [http-nio-8080-exec-4] org.apache.catalina.core.StandardWrapperValve.invoke パス [/project-web-api] を持つコンテキスト内のサーブレット [dispatcherServlet] のServlet.service() が例外 [Request processing failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: env_local] Unable to build Hibernate SessionFactory] が根本的要因と共に投げられました
	org.hibernate.MappingException: Duplicate property mapping of name found in xxx.XXXEntity
		at org.hibernate.mapping.PersistentClass.checkPropertyDuplication(PersistentClass.java:548)

まとめ

いかがでしょうか。
 
IDEやサーバーの設定が絡むエラーは、ハマると時間がどんどん過ぎていくのが厄介なところですよね。分かってしまえば一瞬ですが、辿り着くまでの試行錯誤が地味に辛いです。
 
今回はカラム名重複でしたが、このログ出力の方法は他のエラー調査でもきっと役立つでしょう。例外が発生したときにエラーの詳細が出力されない場合はぜひお試しください。
 
 
 
 
《関連記事》

【エラー解決方法】Maven プロジェクト・ビルダー の実行中にエラーが発生
技術
2015.6.18(Thu)

【エラー解決方法】Maven プロジェクト・ビルダー の実行中にエラーが発生

#Java

【エラー解決方法】JRE or JDK must be available in order to run Eclipse を解決する方法
技術
2023.3.24(Fri)

【エラー解決方法】JRE or JDK must be available in order to run Eclipse を解決する方法

#Java#ツール

【エラー解決方法】Tomcat起動時に「重大: 以前のエラーのためにコンテキストの起動が失敗しました」が発生したときの対処法
技術
2024.7.9(Tue)

【エラー解決方法】Tomcat起動時に「重大: 以前のエラーのためにコンテキストの起動が失敗しました」が発生したときの対処法

#Java#技術

記事をシェア
MOST VIEWED ARTICLES