-
-
Save fernandor777/8dacc4360cee098c6307 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* http://stackoverflow.com/questions/13459718/could-not-serialize-object-cause-of-hibernateproxy | |
* | |
* in bootstrap: | |
* import hbadapter.HibernateProxyTypeAdapter | |
* | |
* class BootStrap { | |
* | |
* def init = { servletContext -> | |
* | |
* GsonBuilder b = new GsonBuilder(); | |
* b.registerTypeAdapterFactory(HibernateProxyTypeAdapter.FACTORY); | |
* Gson gson = b.create(); | |
* ...} | |
* } | |
*/ | |
package hbadapter; | |
import java.io.IOException; | |
import com.google.gson.Gson; | |
import com.google.gson.TypeAdapter; | |
import com.google.gson.TypeAdapterFactory; | |
import org.hibernate.Hibernate; | |
import org.hibernate.proxy.HibernateProxy; | |
import com.google.gson.reflect.TypeToken; | |
import com.google.gson.stream.JsonReader; | |
import com.google.gson.stream.JsonWriter; | |
public class HibernateProxyTypeAdapter extends TypeAdapter<HibernateProxy> { | |
public static final TypeAdapterFactory FACTORY = new TypeAdapterFactory() { | |
@Override | |
@SuppressWarnings("unchecked") | |
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> type) { | |
return (HibernateProxy.class.isAssignableFrom(type.getRawType()) ? (TypeAdapter<T>) new HibernateProxyTypeAdapter(gson) : null); | |
} | |
}; | |
private final Gson context; | |
private HibernateProxyTypeAdapter(Gson context) { | |
this.context = context; | |
} | |
@Override | |
public HibernateProxy read(JsonReader r) throws IOException { | |
throw new UnsupportedOperationException("Not supported"); | |
} | |
@SuppressWarnings({"rawtypes", "unchecked"}) | |
@Override | |
public void write(JsonWriter out, HibernateProxy value) throws IOException { | |
if (value == null) { | |
out.nullValue(); | |
return; | |
} | |
// Retrieve the original (not proxy) class | |
Class<?> baseType = Hibernate.getClass(value); | |
// Get the TypeAdapter of the original class, to delegate the serialization | |
TypeAdapter delegate = context.getAdapter(TypeToken.get(baseType)); | |
// Get a filled instance of the original class | |
Object unproxiedValue = ((HibernateProxy) value).getHibernateLazyInitializer() | |
.getImplementation(); | |
// Serialize the value | |
delegate.write(out, unproxiedValue); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment