NoSuchFieldError
今天在老的工程基础上,进行版本的升级。
老工程:spring2.XX
新工程:spring4.0.6+maven
一起配置完成,在启动的时候spring注入报错,信息如下:
thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [spring/ApplicationContext.xml]: Initialization of bean failed; nested exception is java.lang.NoSuchFieldError: NULL
刚开始看觉得是数据源配置有问题,左看右看上看下看也没发现问题。
网络上搜也么有一个靠谱的答案。
没办法只能一步步跟进spring,最后定位在StandardEvaluationContext类的setRootObject中,
给rootObject设值的时候出错了,
this.rootObject = TypedValue.NULL;
查看异常这里的异常信息:
java.lang.NoClassDefFoundError: Could not initialize class org.springframework.expression.TypedValue
查看TypedValue.NULL的设置:
public static final TypedValue NULL = new TypedValue(null, TypeDescriptor.NULL);
原来TypedValue.NULL是TypedValue的一个空实例
继续往下查看TypedValue的构造方法:
public TypedValue(Object value, TypeDescriptor typeDescriptor) {
this.value = value;
this.typeDescriptor = typeDescriptor;
}
就是简单的设置属性,毫无异常可能
于是乎想查看TypeDescriptor.NULL,发现怎么点也点不进去,
于是点开TypeDescriptor类,没发现NULL属性。
这是怎么回事呢。
看一下spring的jar包,
TypedValue类在spring-core包中,
TypeDescriptor类在spring-expression包中。
突然注意到两个包的版本号不一样,
spring-expression是3.0.5
spring-core是4.0.6。
猜想可能是版本的差异,到POM.xml中查看spring的配置,并无特别指定。
再看看其它的spring包,也有几个不是4.0.6的版本。
maven为什么不把spring用统一的版本依赖下来呢,先不追究了。
在pom.xml中,指定版本不正确的几个spring包。
工程重新构建后,运行,OK。