程序中使用如下pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.3.9.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-reactor-netty</artifactId>
</exclusion>
</exclusions>
</dependency>
程序运行时报如下错误:
java.lang.IncompatibleClassChangeError:Expected non-static field org.springframework.web.reactive.result.method.InvocableHandlerMethod.logger
at org.springframework.web.reactive.result.method.InvocableHandlerMethod.logArgumentErrorIfNecessary(InvocableHandlerMethod.java:207)
查看spring-webflux-5.2.13.RELEASE.jar中InvocableHandlerMethod的代码:
查看spring-web-5.3.1.jar中HandlerMethod的代码:
InvocableHandlerMethod中用到的logger,是在HandlerMethod中定义的。
其实这个问题的根本原因就是spring-webflux-5.2.13.RELEASE.jar中编译InvocableHandlerMethod时用到的HandlerMethod,其中logger并没有定义成static的;而现在运行时用到的spring-web-5.3.1.jar中HandlerMethod已经将logger定义成static的了,因此报了这个错。
从pom.xml的依赖层级中也能看出来spring-webflux的版本低了,其它spring相关jar的版本都在5.3.1以上了。
为了验证HandlerMethod中logger的定义以前不是static的,可以把spring-boot-starter-web的版本改成2.3.9.RELEASE看看。
这时,spring-web的版本为spring-web-5.2.13.RELEASE.jar,其中HandlerMethod的代码:
logger确实不是定义成static的。
既然知道了问题的原因,修改也就简单了,只要把spring-boot-starter-webflux的版本也修改成2.4.0就行:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.4.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.4.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-reactor-netty</artifactId>
</exclusion>
</exclusions>
</dependency>
这时pom.xml的依赖层级中就会显示成如下:
spring-webflux变成了spring-webflux-5.3.1.RELEASE.jar。运行时也不会再抛出上面的异常了,问题最终解决。