Spring启动报错:创建CommandService Bean失败 读写方法类型不匹配
异常核心信息
向监听器类
com.thomson.live.wca.web.listener.WCAListener实例发送上下文初始化事件时抛出异常,嵌套调用链路如下:
- 最外层:
org.springframework.beans.factory.BeanCreationException,创建名为mbeanExporter的Bean时init方法调用失败- 第一层嵌套:
org.springframework.beans.factory.BeanCreationException,ServletContext资源/WEB-INF/spring/spring-config.xml中定义的名为CommandService的Bean初始化失败- 第二层嵌套:
org.springframework.beans.FatalBeanException,获取类com.thomsonreuters.wlb.news.command.impl.CommandService的BeanInfo失败- 根异常:
java.beans.IntrospectionException: type mismatch between read and write methods,即类属性的读写方法类型不匹配
注:异常栈所有类名、方法名、行号均保留原始内容未做修改
根因定位
- 直接报错原因:Spring的
mbeanExporter在初始化阶段会扫描容器内所有Bean,通过Java内省机制解析Bean属性生成JMX MBean元数据。扫描到com.thomsonreuters.wlb.news.command.impl.CommandService类时,内省检测到该类存在不符合JavaBean规范的属性:某属性的getter方法返回值类型和对应setter方法的入参类型不匹配,直接抛出IntrospectionException,顺着调用链最终导致上下文初始化失败。 - 配置层面隐患:pom.xml存在多处错误配置,容易引发类冲突、依赖缺失等问题,间接提升这类异常的排查难度:
- 项目整体基于Spring 3.x开发,却错误引入2.6.6版本的Spring Boot打包插件,两个大版本的Spring类路径存在大量不兼容,极易出现类版本覆盖问题
spring-web依赖错误配置了<type>pom</type>,会导致实际依赖引入失效或引入错误版本的类- 冗余配置了
spring-asm依赖还设置了自排除规则,属于完全无用的配置,徒增配置复杂度
修复方案
按优先级从高到低操作:
1. 修复CommandService类的JavaBean不规范问题
这是触发报错的直接原因,必须优先处理:
- 打开
CommandService类源码,逐行核对所有属性的get/set方法对:- 保证同名属性的getter返回值类型和setter入参类型完全一致,不允许出现类型不匹配的情况
- 重点排查布尔类型属性:避免出现
isXxx()返回Boolean包装类、但setXxx()入参是boolean基本类型,或者反过来的写法;也不要出现getter返回子类类型、setter入参是父类类型的写法 - 如果存在set方法重载,要确保和属性对应的set方法参数类型和getter返回值匹配,避免Java内省机制误识别到重载的错误方法
- 临时绕过方案(仅用于紧急恢复启动,不建议长期使用):如果不需要把
CommandService暴露为JMX MBean,可以在Spring配置文件中给mbeanExporter配置排除规则,跳过该Bean的JMX解析:
<bean id="mbeanExporter" class="org.springframework.jmx.export.MBeanExporter"> <property name="excludedBeans" value="CommandService"/> <!-- 保留该bean原有的其他配置项 --> </bean>
2. 清理pom.xml中的错误配置
避免后续出现其他依赖冲突类问题:
- 直接删除
spring-asm依赖:Spring 3.1.2版本已经内置了asm相关的类,不需要单独引入,当前配置的自排除规则本身就没有实际引入该依赖,属于冗余配置 - 修正
spring-web依赖配置:删除<type>pom</type>这行配置,spring-web是jar类型依赖,错误配置type会导致依赖引入异常 - 直接删除
spring-boot-maven-plugin插件配置:该项目是传统Spring MVC的war包项目,不是Spring Boot项目,引入跨大版本的Spring Boot插件会导致打包、运行时的类冲突问题 - 统一所有Spring相关依赖(spring-core、spring-beans、spring-web、spring-webmvc、spring-test等)的版本号,确保所有Spring包版本完全一致,禁止混装不同版本的Spring组件
内容的提问来源于stack exchange,提问作者Sagar
相关产品推荐
相关产品推荐

