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。

 

posted @ 2014-08-23 21:48  havery  阅读(471)  评论(0)    收藏  举报