一、使用SpringMVC搭建WEB项目时报错404的问题排查解决
很早前(4年前)就把这个搭建过,但今天运行的时候就是报404错误,见文章: JAVA开发中SpringMVC框架的使用及常见的404问题原因以及SpringMVC框架基于注解的开发实例-CSDN博客文章浏览阅读352次,点赞6次,收藏17次。在项目执行的时候可能容易遇到404错误,如果代码上没有什么问题,错误可能出在使用tomcat运行的时候未把lib包放到tomcat下,导致tomcat运行时找不到jar包从而运行出错。另外上面在配置springMVC框架的时候需要指定contextConfigLocation上下文的配置文件地址,即SpringMVC集合spring时,spring需要用的配置文件,如上我们使用的springmvc-servlet.xml文件,此文件放在java源代码下的src/main/resources目录中。https://linge.blog.csdn.net/article/details/142846672 经过检查,基本的错误原因都可以完全排除,程序代码没有问题,WEB导入包也没有问题,静态资源过滤以及编译出来的 out 目录中的文件也都正常,但是就是报 404 错误,而且 Tomcat 页面就只是显示无法找到资源,也没有更编辑 的错误。
类型 状态报告
描述 源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
认真看了看控制台的日志,发现有
org.springframework.web.servlet.DispatcherServlet 未分配到 javax.servlet.Servlet,jakarta.servlet. 以及 org.apache.catalina.core.ApplicationContext.log 将servlet[springmvc]标记为不可用
有网友反馈也有类似情况,包括 spring-webmvc 版本太高了,所以我这里把spring-mvc降级到 5.3.39 版本,但是问题依旧。还有Tomcat的版本过高,目前用的是10 版本,于是试着 针对 Tomcat 的版本也进行降降,就把 Tomcat10版本降到了 Tomcat9版本。
发现 Tomcat 版本降级之后,发现现在页面的日志详细多了。看到了错误和其根本原因提示:
org.xml.sax.SAXParseException; lineNumber: 10; columnNumber: 55; cvc-complex-type.2.4.c: 通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明。
于是修改了 spring 配置中的声明问,解决了声明的问题之后又碰到了一个新的问题。
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [D:\5.java\spring-anno\out\artifacts\spring_anno_Web_exploded\WEB-INF\classes\org\example\controller\IndexController.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [D:\5.java\spring-anno\out\artifacts\spring_anno_Web_exploded\WEB-INF\classes\org\example\controller\IndexController.class]; nested exception is java.lang.IllegalArgumentException: Unsupported class file major version 65
此处异常的原因是 :jdk不匹配,需要替换jdk版本即可。目前IDE中的JDK版本是 21,Spring版本是 5.1,Spring Framework 5.3.x: JDK 8-17 (expected) 所以考虑把 Spring 升上去。之前为尝试解决问题把 Spring版本降低了实际未启作用。 于是修改成了 6.1.6 版本。之后便正常运行起来了 SpringMVC 项目。
二、SpringMVC项目中web.xml配置文件init-param行标红
SpringMVC项目中web.xml配置文件init-param行标红,报错如下:cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param' 。
cvc-complex-type.2.4.a: Invalid content was found starting with element 'init-param'. One of '{"http://java.sun.com/xml/ns/javaee":description, "http://java.sun.com/xml/ns/javaee":display-name, "http://java.sun.com/xml/ns/javaee":icon, "http://java.sun.com/xml/ns/javaee":servlet-name}' is expected.
错误原因原来竟是 init-param 的存放位置不对,可我没想到不对到这种程度,这种要求真是撤单啊。解决方法是要把 init-param 放在servlet里面,并且一定要放在 servlet-class 后面,中间隔行别的都不行,而我中间正是加了一行 load on startup 配置就导致这个错误。
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup> ### 这行不能写在此,要删除放下面的位置
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
还是那句话,这个要求有点扯淡。