今天服务部署到云端后,前台的调用到了后台时,出现了如下报错,查看后端代码后发现其模块内部会跨服务调AUTH模块中的方法,而这个方法由于我用<IPage>分页接口封装了,调用后序列化出现异常,所以报这个错:
"Type definition error: [simple type, class com.baomidou.mybatisplus.core.metadata.IPage]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.baomidou.mybatisplus.core.metadata.IPage` (no Creators, like default constructor, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at [Source: (ByteArrayInputStream); line: 1, column: 18] (through reference chain: cn.esky.basic.base.R[\"data\"])"
其实仔细看黄底的这句报错,已经把错误原因很清楚的摆上来了,意思就是苞米豆下的这个IPage类型异常,然后再去到代码中:
这里是INDEX模块跨服务调用AUTH模块的getAllTeam接口,注意这里是<IPage>分页,而 com.baomidou.mybatisplus.core.metadata.IPage是一个接口(interface),源代码如下:
之前在本地服务内部调用没有出现过问题是因为内部已经有了对应的实现,可以将其实现,但一旦出现别的模块跨服务调用就出现问题了,因为跨服务会涉及http对其进行序列化和得到字符串数据后的反序列化操作,这样别的模块在调用到我这里后得到数据,序列化成字符串通过IO输出流传回去再反序列化成Class不能构建实例,但IPage是个接口啊,他到了那头有没有实现,他怎么办,所以说,只能报这个错Type definition error。。。
下面把代码改成<Page>后,就没有出现问题了
唉,说到这,其实只要稍微对英文报错敏感一点,看一眼也就知道问题出在哪了,说到底还是因为自己经验不足。