-
Notifications
You must be signed in to change notification settings - Fork 106
/
PersistentCollectionSerializer.java
117 lines (103 loc) · 4.08 KB
/
PersistentCollectionSerializer.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.fasterxml.jackson.datatype.hibernate;
import java.io.IOException;
import org.hibernate.collection.PersistentCollection;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.*;
/**
* Wrapper serializer used to handle aspects of lazy loading that can be used
* for Hibernate collection datatypes.
*/
public class PersistentCollectionSerializer
extends JsonSerializer<PersistentCollection>
implements ContextualSerializer
{
protected final boolean _forceLazyLoading;
/**
* This is the nominal type used to locate actual serializer to use
* for contents, if this collection is to be serialized.
*/
protected final JavaType _serializationType;
/**
* Serializer to which we delegate if serialization is not blocked.
*/
protected final JsonSerializer<Object> _serializer;
/*
/**********************************************************************
/* Life cycle
/**********************************************************************
*/
public PersistentCollectionSerializer(JavaType type, boolean forceLazyLoading) {
this(type, forceLazyLoading, null);
}
@SuppressWarnings("unchecked")
public PersistentCollectionSerializer(JavaType type, boolean forceLazyLoading,
JsonSerializer<?> serializer)
{
_serializationType = type;
_forceLazyLoading = forceLazyLoading;
_serializer = (JsonSerializer<Object>) serializer;
}
/**
* We need to resolve actual serializer once we know the context; specifically
* must know type of property being serialized.
* If not known
*/
public JsonSerializer<PersistentCollection> createContextual(SerializerProvider provider,
BeanProperty property)
throws JsonMappingException
{
/* If we have property, should be able to get actual polymorphic type
* information.
* May need to refine in future, in case nested types are used, since
* 'property' refers to field/method and main type, but contents of
* that type may also be resolved... in which case this would fail.
*/
JsonSerializer<?> ser = provider.findValueSerializer(_serializationType, property);
return new PersistentCollectionSerializer(property.getType(),
_forceLazyLoading, ser);
}
/*
/**********************************************************************
/* JsonSerializer impl
/**********************************************************************
*/
@Override
public void serialize(PersistentCollection coll, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException
{
// If lazy-loaded, not yet loaded, may serialize as null?
if (!_forceLazyLoading && !coll.wasInitialized()) {
jgen.writeNull();
return;
}
Object value = coll.getValue();
if (value == null) {
provider.defaultSerializeNull(jgen);
} else {
if (_serializer == null) { // sanity check...
throw new JsonMappingException("PersitentCollection does not have serializer set");
}
_serializer.serialize(value, jgen, provider);
}
}
public void serializeWithType(PersistentCollection coll, JsonGenerator jgen, SerializerProvider provider,
TypeSerializer typeSer)
throws IOException, JsonProcessingException
{
if (!_forceLazyLoading && !coll.wasInitialized()) {
jgen.writeNull();
return;
}
Object value = coll.getValue();
if (value == null) {
provider.defaultSerializeNull(jgen);
} else {
if (_serializer == null) { // sanity check...
throw new JsonMappingException("PersitentCollection does not have serializer set");
}
_serializer.serializeWithType(value, jgen, provider, typeSer);
}
}
}