Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
当我们使用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.完成.
参考别人的博客并加以整理.
Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?的更多相关文章
- HibernateProxy异常处理 java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
这里使用google的Gson包做JSON转换,因为较早的1.4版本的FieldAttributes类中没有getDeclaringClass()这个方法,这个方法是获取field所属的类,在我的排除 ...
- java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration解决方法
Autowiring of fields failed; nested exception is...........Error creating bean with name 'siteOperat ...
- java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataProvider
Caused by: java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/MetadataProvi ...
- Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Caused by: java.lang.NoClassDefFoundError: org/hibernate/cfg/Configuration
1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...
- Caused by: java.lang.ClassNotFoundException: org.hibernate.service.jta.platform.spi.JtaPlatform
1.错误描述 2014-7-12 22:08:01 org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema up ...
- Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro
1.错误描述 信息: MLog clients using java 1.4+ standard logging. 2014-7-12 19:29:20 com.mchange.v2.c3p0.C3P ...
- org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested exception is java.lang.IllegalArgumentException: org.hibernate.QueryException: JPA-style positional param w
org.hibernate.QueryException: JPA-style positional param was not an integral ordinal; nested excepti ...
- java.lang.NoClassDefFoundError: org/hibernate/QueryTimeoutException
在做ssh整合的时候报错:java.lang.NoClassDefFoundError: org/hibernate/QueryTimeoutException org.springframework ...
随机推荐
- SOCKET.IO 的用法 系统API,
原文:http://www.cnblogs.com/xiezhengcai/p/3956401.html 1. 服务端 io.on('connection',function(socket)); 监听 ...
- 解决long类型传到前端损失精度问题
原因: 解决办法:https://blog.csdn.net/xiaoxiangzi520/article/details/76522242 经过验证,发现上述解决办法回导致前端先后台传输数据时导致j ...
- ubuntu 上安装node.js 的简单方法
一.安装 1.$ sudo apt-get install nodejs 2.$ sudo apt-get install npm 二.升级 1.升级npm命令如下: $ sudo npm i ...
- 在安卓手机上安装完整kali linux系统
俗话说,没图说个JB.好我马上上图 提醒:我在这里只是提供一个思路过程,希望可以帮到你,同时我也做一个记录,有任何问题欢迎 0.0.:I87OI94664 威信 :Z2tsYmI1MjA= (b ...
- Demystify Git
Git虽然很时髦,但是不好学,不好用. 关键是不好理解. 本文用最通俗易懂又直观的方式,帮助大家理解git, git的内部组织, 基本概念,还有常用 的工作流程. 本文来自墙外. 习某某说:" ...
- find命令简单使用
find命令是Linux系统查找文件的命令,能帮助用户在使用.管理Linux的日常事务时方便的查找出用户所需要的文件,find命令基本格式是:find [路径] [选项] [操作]. 列举一下find ...
- docker 网络 路由
通过在Docker宿主机上添加静态路由实现跨宿主机通信 模拟环境 主机1(192.168.58.144) 设置docker0 网关 (172.17.0.1/16) 主机2 ...
- 后台管理系统好用的UI框架
https://www.layui.com/demo/form.html
- jQuery汇总
closest() 方法返回被选元素的第一个祖先元素. $("span").closest("ul")返回 <span> 的第一个祖先元素,是一个 ...
- php-fpm重启操作
启动php-fpm:/usr/local/php/sbin/php-fpm php 5.3.3 以后的php-fpm 不再支持 php-fpm 以前具有的 /usr/local/php/sbin/ph ...