Attempted to serialize java.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
6479 ワード
gsonを使用してオブジェクトを回転すると、このオブジェクトのいくつかの属性が怠惰にロードされます.
Attempted to serialize javaが表示されます.lang.Class: org.hibernate.proxy.HibernateProxy. Forgot to register a type adapter?
理由は次のとおりです.
hibernateは怠惰にロードする方式でデータベースを検索して、つまり使ってやっと本当のデータを調べて、使えないならただ1つの代理オブジェクトを返して、gsonは代理オブジェクトを識別することができなくて、だから変換することができません.
解決策:
1.クラスを新規作成し、Type Adapterを継承
2.gsonオブジェクトの構築
3.完了
他人のブログを参考にして整理する.
@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は怠惰にロードする方式でデータベースを検索して、つまり使ってやっと本当のデータを調べて、使えないならただ1つの代理オブジェクトを返して、gsonは代理オブジェクトを識別することができなくて、だから変換することができません.
解決策:
1.クラスを新規作成し、Type Adapterを継承
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 {
public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() {
@Override
public TypeAdapter create(Gson gson, TypeToken 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.完了
他人のブログを参考にして整理する.