发送邮件时出现SpringController的Servlet.init()异常求助
解决Spring Controller初始化时的HTTP 500错误(ASM ClassReader异常)
咱们先从你给出的栈追踪里抓核心问题——最底层的异常是java.lang.IllegalArgumentException出现在org.springframework.asm.ClassReader的构造方法里,这个问题大概率是Spring版本和JDK版本不兼容导致的。ASM是Spring用来解析类字节码的工具,不同版本的ASM对应不同的JDK字节码规范,如果你的Spring版本太老,没法处理高版本JDK编译的类,就会触发这个初始化异常。
下面是具体的排查和解决步骤:
第一步:核对Spring与JDK的版本兼容性
- 举个例子:Spring 3.x最高只支持JDK 1.7,如果你用JDK 1.8及以上版本编译代码,肯定会出问题;Spring 4.x开始支持JDK 1.8,Spring 5.x则兼容JDK 8到17的版本。
- 你可以先确认自己项目的Spring版本:如果是3.x,要么把JDK降级到1.7,要么直接升级Spring到4.x及以上版本(更推荐后者,毕竟旧版本Spring已经停止维护了)。
第二步:排查ASM依赖版本冲突
- 有时候项目里引入的其他第三方依赖,可能自带了旧版本的ASM,和Spring本身依赖的ASM版本打架。你可以用Maven的
mvn dependency:tree或者Gradle的./gradlew dependencies命令生成依赖树,找出冲突的ASM依赖,然后在pom.xml或build.gradle里排除掉旧版本。 - 比如Maven里排除冲突的写法:
<dependency> <groupId>第三方依赖的groupId</groupId> <artifactId>第三方依赖的artifactId</artifactId> <exclusions> <exclusion> <groupId>org.ow2.asm</groupId> <artifactId>asm</artifactId> </exclusion> </exclusions> </dependency>
- 有时候项目里引入的其他第三方依赖,可能自带了旧版本的ASM,和Spring本身依赖的ASM版本打架。你可以用Maven的
第三步:逐步排查spring-mvc.xml配置问题
- 虽然你觉得配置没问题,但可以先做个测试:暂时注释掉spring-mvc.xml里和邮件发送相关的bean配置,重启服务器看看还会不会抛出初始化异常。如果注释后异常消失,说明邮件相关的配置里可能引用了用高版本JDK编译的类,或者配置本身有语法错误(比如XML标签没闭合、命名空间写错)。
第四步:统一编译和运行的JDK版本
- 还要确认项目编译用的JDK版本和服务器运行时的JDK版本一致,避免出现“编译用JDK 11,运行用JDK 8”这种情况。比如在IDEA里检查Project Structure的SDK和Language Level,Maven的pom.xml里可以配置
maven-compiler-plugin来锁定版本:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin>
- 还要确认项目编译用的JDK版本和服务器运行时的JDK版本一致,避免出现“编译用JDK 11,运行用JDK 8”这种情况。比如在IDEA里检查Project Structure的SDK和Language Level,Maven的pom.xml里可以配置
等你解决了Servlet初始化的500问题后,再回头排查邮件发送失败的问题——比如检查邮箱授权码是否正确、SMTP服务器地址/端口是否配置对、服务器防火墙是否开放了SMTP端口这些点就行。
内容的提问来源于stack exchange,提问作者srinivasarao jella
相关产品推荐
相关产品推荐

