Spring Boot Entity加JSONObject字段触发resolve a type but got null报错
问题原因
JPA(默认Hibernate实现)没有内置JSONObject类型的映射规则,无法识别该非标准数据库字段类型,导致启动时类型解析失败。
解决方案
方案1:使用AttributeConverter自定义类型转换(推荐,兼容所有JPA 2.1+版本)
- 新增JSONObject和数据库字符串类型的转换器
import com.alibaba.fastjson.JSONObject; import jakarta.persistence.AttributeConverter; import jakarta.persistence.Converter; // autoApply = true 表示所有JSONObject类型字段自动应用该转换器,也可以关闭后单独在字段指定 @Converter(autoApply = true) public class JSONObjectConverter implements AttributeConverter<JSONObject, String> { // 实体转数据库存储值:将JSONObject序列化为JSON字符串 @Override public String convertToDatabaseColumn(JSONObject attribute) { return attribute == null ? null : attribute.toJSONString(); } // 数据库值转实体:将JSON字符串反序列化为JSONObject @Override public JSONObject convertToEntityAttribute(String dbData) { return dbData == null ? null : JSONObject.parseObject(dbData); } }
- 调整实体类字段配置,指定对应转换器
@Convert(converter = JSONObjectConverter.class) @Column(name = "childrenkoli_re", columnDefinition = "json") private JSONObject childrenkoli;
*如果使用Jackson等其他JSON库,对应修改转换器内的序列化、反序列化逻辑即可,数据库字段建议设置为json/jsonb类型提升存储效率。
方案2:字段改用String类型存储,业务层手动转换
修改实体类字段为字符串类型,在需要使用JSON结构的业务代码中手动做序列化/反序列化:
// 实体类字段定义 @Column(name = "childrenkoli_re", columnDefinition = "json") private String childrenkoliStr; // 业务代码中转换示例 // 存值:JSONObject转字符串 inbound.setChildrenkoliStr(jsonObj.toJSONString()); // 取值:字符串转JSONObject JSONObject childrenkoli = JSONObject.parseObject(inbound.getChildrenkoliStr());
方案3:Hibernate 6+版本使用内置JSON类型支持
如果使用Hibernate 6及以上版本,可以直接用内置的JsonType实现映射,无需自定义转换器:
import org.hibernate.annotations.Type; import org.hibernate.type.JsonType; @Column(name = "childrenkoli_re", columnDefinition = "json") @Type(JsonType.class) private JSONObject childrenkoli;
内容的提问来源于stack exchange,提问作者Adam Abdullah
相关产品推荐
相关产品推荐

