Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
Posted on 2018-11-02 09:49 守护锁链 阅读(2667) 评论(0) 编辑 收藏 举报当我们使用gson 转对象时,并且这个对象中有一些属性是懒加载时如
@Entity @Table(name = "user") public class User { @Id @Column(columnDefinition="varchar(255)") @GeneratedValue(generator="idGenerator") @GenericGenerator(name="idGenerator", strategy="uuid") private String userId; private String userName; private String nickName; private String passWord; private String phoneNumber; @ManyToOne(cascade = {CascadeType.ALL},optional = true,fetch = FetchType.LAZY) @JoinColumn(name = "enterprise_Id") private EnterpriseInfo enterpriseInfo; }
会出现Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
原因是:
hibernate采取懒加载的方式查询数据库,也就是只有用到了才去查真正的数据,用不到的话只是返回一个代理对象,gson识别不了代理对象,所以没法转换.
解决办法:
1.新建一个类,并继承TypeAdapter
import com.google.gson.Gson; import com.google.gson.TypeAdapter; import com.google.gson.TypeAdapterFactory; import com.google.gson.reflect.TypeToken; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonWriter; import org.hibernate.Hibernate; import org.hibernate.proxy.HibernateProxy; import java.io.IOException; /** * @ClassName HibernateProxyTypeAdapter * @Description 解决gson转换中对象有懒加载情况报错: * @Author PC * @Date 2018/10/29 10:23 **/ public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> { public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { @Override public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) { return (HibernateProxy.class.isAssignableFrom(typeToken.getRawType())? (TypeAdapter) new HibernateProxyTypeAdapter(gson):null); } }; private final Gson context; private HibernateProxyTypeAdapter(Gson gson){ this.context = gson; } @Override public void write(JsonWriter jsonWriter, HibernateProxy hibernateProxy) throws IOException { if (hibernateProxy==null){ jsonWriter.nullValue(); return; } Class<?> baseType = Hibernate.getClass(hibernateProxy); TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType)); Object unproxiedValue = ((HibernateProxy) hibernateProxy).getHibernateLazyInitializer() .getImplementation(); delegate.write(jsonWriter,unproxiedValue); } @Override public HibernateProxy read(JsonReader jsonReader) throws IOException { throw new UnsupportedOperationException("Not support"); } }
2.构建gson对象
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd") .registerTypeAdapterFactory( HibernateProxyTypeAdapter.FACTORY).create() ;
3.完成.
参考别人的博客并加以整理.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架