一、问题场景
数据库的user表中有一个info字段,是JSON类型(如下),而目前User实体类中却是String类型,这样一来,我们要读取info中的属性时就非常不方便。如果要方便获取,info的类型最好是一个Map或者实体类。
{"age": 20, "intro": "佛系青年", "gender": "male"}
而一旦我们把info改为对象类型,就需要在写入数据库时手动转为String,再读取数据库时,手动转换为对象,这会非常麻烦。
因此MybatisPlus提供了很多特殊类型字段的类型处理器,解决特殊字段类型与数据库类型转换的问题。例如处理JSON就可以使用JacksonTypeHandler处理器。
常规步骤:
- 定义一个用来填充info的实体类
package com.itheima.mp.domain.po;
import lombok.Data;
@Data
public class UserInfo {
private Integer age;
private String intro;
private String gender;
}
- 将User类的info字段修改为UserInfo类型,并声明类型处理器
此时出现了查出info为null的问题,后面解决后仍出现了报错问题,下面逐项解决,报错如下:
16:13:23 ERROR 2068 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'info' from result set. Cause: java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.itheima.mp.domain.po.UserInfo` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"age": 19, "intro": "青涩少女", "gender": "female"}"; line: 1, column: 2]] with root cause
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `com.itheima.mp.domain.po.UserInfo` (no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
二、问题分析及解决
2.1 查询结果为null问题
原因:自动映射查询结果出错
解决方案: 在类上增加自动映射查询结果到Java对象的属性----autoResultMap=true
2.2 报错问题
分析:
这个异常表明了在尝试将数据库中的 JSON 字符串反序列化成 UserInfo 对象时出现了问题。错误信息指出了Jackson库无法构造 UserInfo 的实例,因为没有可用的构造函数(没有默认构造函数或其他可用构造函数)。
注意:我已经在类上加过了@Data注解,按理来说应该是包含构造方法的,但是这里没起作用,这一点很容易被忽略!!!
解决:改变一下lombok的依赖版本,或者直接手动添加一下全参和无参构造方法(Alt+insert快捷键)
三、结束
关于一些因为配置出现的问题有很多形式和原因,任何疑问欢迎私信指教!!!
分享:
秦王扫六合,虎视何雄哉!
挥剑决浮云,诸侯尽西来。