当我们使用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.完成.

参考别人的博客并加以整理.

编辑推荐:
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

随笔 - 19, 文章 - 0, 评论 - 0, 阅读 - 17713

Copyright © 2025 守护锁链
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示