1.老项目使用 hibernate 的框架,entry 层主键 id 使用的是 Integer 类型.代码如下:
...
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
...
2.接口里面调用 getId 的时候会报 java.lang.NoSuchMethodError 的错误.
adviserChanges.setService_log_id(serviceLog.getId());
3.报错信息如下:
java.lang.NoSuchMethodError:cn.xxx.xxx.xxx.modules.studyservice.entity.ServiceLog.getId()I
atcn.xxx.xxx.bj.modules.auslocal.service.AssignBigClassStudentService.assignAdviser(AssignBigClassStudentService.java:371)
atcn.xxx.bpm.bj.modules.auslocal.service.AssignBigClassStudentService$$FastClassByCGLIB$$d542d115.invoke(<generated>)
4.刚开始猜测是不是因为编译有问题,后来反编译了.class 文件,发现反编译之后是有 getId 这个方法的. 而且测试环境和本地都是好使得,但是线上就出问题了.
1
TtTtTtT 2022-03-01 16:06:59 +08:00
.getId()I 里的 I 是基础类型,你的 Java 代码是包装类。怎么改就布吉岛了。。
|
2
Jooooooooo 2022-03-01 16:07:55 +08:00
包冲突了, 你全局搜搜 modules.studyservice.entity.ServiceLog 这个是不是别的 jar 也有这个路径的方法.
|
3
jiobanma OP |
4
Jooooooooo 2022-03-01 16:14:58 +08:00
@jiobanma 说的是依赖的 jar
|
5
wolfie 2022-03-01 16:18:16 +08:00
用 arthas 运行时反编译
|
6
jiobanma OP @Jooooooooo 查过了 没有其他地方使用
|
7
jiobanma OP |
8
jiobanma OP @Jooooooooo
@TtTtTtT @wolfie 有没有可能是 改动了 ServiceLog 这个 entity 的 id 数据类型(之前是 int 的),但是 service 层没有代码改动, service 层的.class 文件没有重新编译,但是 entity 重新编译了,所以导致的. |
9
Junzhou 2022-03-01 17:24:17 +08:00
mvn clean ,然后重新打包。
|
10
lsk569937453 2022-03-01 17:25:32 +08:00
把 target 目录删了,重新编译一下项目
|
11
mosliu 2022-03-01 17:32:53 +08:00
一般整体重新编译重新部署最简单。
另外 检查下调用的包名 和 getId 的包名确定一致么 |
12
mosliu 2022-03-01 17:37:38 +08:00
还有看看 jdk 版本是否兼容?
考虑 jdk9+的模块化特性 没暴露? |
13
chenshun00 2022-03-01 17:42:41 +08:00
去 lib 目录看看有没有重复的 jar 包吧,一般都是这个原因,或者是加载到了别人的类
|
14
jiobanma OP @TtTtTtT
@Jooooooooo @wolfie @Junzhou @lsk569937453 @mosliu @chenshun00 感谢各位大佬,基本确定问题了,线上的 jenkins 打包的脚本有问题,应该是 mvn 那边只对修改过的类进行编译,并没对引用的类进行编译导致的. |