1 package com.vladmihalcea.hibernate.type.util;
2
3 import com.fasterxml.jackson.databind.JavaType;
4 import com.fasterxml.jackson.databind.type.TypeFactory;
5 import org.hibernate.internal.util.SerializationHelper;
6
7 import java.io.Serializable;
8 import java.util.Collection;
9
10
13 public class ObjectMapperJsonSerializer implements JsonSerializer {
14
15 private final ObjectMapperWrapper objectMapperWrapper;
16
17 public ObjectMapperJsonSerializer(ObjectMapperWrapper objectMapperWrapper) {
18 this.objectMapperWrapper = objectMapperWrapper;
19 }
20
21 @Override
22 public <T> T clone(T value) {
23 if (value instanceof Collection && !((Collection) value).isEmpty()) {
24 Object firstElement = ((Collection) value).iterator().next();
25 if (!(firstElement instanceof Serializable)) {
26 JavaType type = TypeFactory.defaultInstance().constructParametricType(value.getClass(), firstElement.getClass());
27 return objectMapperWrapper.fromString(objectMapperWrapper.toString(value), type);
28 }
29 }
30
31 return value instanceof Serializable ?
32 (T) SerializationHelper.clone((Serializable) value) :
33 objectMapperWrapper.fromString(objectMapperWrapper.toString(value), (Class<T>) value.getClass());
34 }
35 }
36