如何解决Spring MVC项目中Invalid property 'class.module.classLoader.resources'错误
这个错误的核心是Spring MVC的参数绑定机制在尝试自动实例化Tomcat内部类org.apache.catalina.WebResourceRoot,但该类没有无参构造方法,导致实例化失败。触发问题的原因是请求中包含了类似class.module.classLoader.resources的参数,Spring沿着这个嵌套属性路径尝试自动创建对象,而WebResourceRoot作为Tomcat的资源管理类,本来就不是给应用层代码实例化用的。
1. 清理请求参数
检查测试时发送的请求,确认是否传入了class.module.classLoader.resources这类无关参数,直接删除这些参数即可解决问题。这类参数通常是误传或者测试工具自动生成的冗余内容。
2. 限制参数绑定的字段范围
如果你的Controller使用了@ModelAttribute接收参数,通过@InitBinder明确指定允许绑定的字段,避免Spring尝试绑定所有请求参数到对象的内部属性:
@Controller public class DemoController { @InitBinder public void initBinder(WebDataBinder binder) { // 只允许绑定你业务需要的字段,比如name、id等 binder.setAllowedFields("name", "id"); // 或者直接排除所有class开头的属性路径,从根源阻断这类绑定 binder.setDisallowedFields("class.*"); } @GetMapping("/demo") public String demo(@ModelAttribute YourCustomDto dto) { // 业务逻辑 return "demo"; } }
3. 避免使用JDK核心类作为参数接收对象
不要直接把java.lang.Module这类JDK核心类作为Controller方法的参数(比如@ModelAttribute Module module),换成自定义的DTO/VO类,只包含你业务需要的字段,从根本上避免Spring去绑定JDK类的复杂内部属性。
4. 关闭自动增长嵌套路径功能
在Spring Boot配置文件(application.properties或application.yml)中关闭参数绑定的自动嵌套路径增长功能,这样Spring遇到不存在的属性路径时会直接报错,而不是尝试实例化对象:
# application.properties spring.mvc.data-binder.auto-grow-nested-paths=false
# application.yml spring: mvc: data-binder: auto-grow-nested-paths: false
内容的提问来源于stack exchange,提问作者v1nw1n

