如何解决Servlet.init() for servlet [dispatcher]抛出的异常问题
requestMappingHandlerAdapter Bean创建失败问题 错误栈信息
javax.servlet.ServletException: Servlet.init() for servlet [dispatcher] threw exception org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:528) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798) org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:810) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Thread.java:748)
根本原因分析
从嵌套异常链可以定位核心问题:
org.springframework.beans.factory.BeanCreationException: 创建在org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration中定义的名为'requestMappingHandlerAdapter'的Bean时出错:通过工厂方法实例化Bean失败;嵌套异常为org.springframework.beans.BeanInstantiationException: 无法实例化[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter]:工厂方法'requestMappingHandlerAdapter'抛出异常;嵌套异常为java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/exc/InvalidDefinitionException
最终根源是java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException——你的项目缺失了Jackson Databind相关依赖,导致Spring初始化requestMappingHandlerAdapter这个核心MVC组件时,找不到序列化/反序列化所需的Jackson类。
解决方案
根据项目构建工具,添加对应的Jackson Databind依赖:
Maven项目(修改pom.xml)
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> <!-- 建议使用与Spring版本兼容的稳定版 --> </dependency>
Gradle项目(修改build.gradle)
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
注意:版本号尽量与项目中Spring框架版本保持兼容,避免依赖冲突。如果不确定兼容版本,可通过Spring官方文档或依赖管理插件(如Maven的dependencyManagement)统一管控版本。
内容的提问来源于stack exchange,提问作者Suresh Kholiya

