Skip to content

Commit 1997c76

Browse files
inponomarevartembilan
authored andcommitted
Better generci types in JsonSerde/JsonDeserializer
* bounded wildcards for JsonDeserializer targetType * added deserializer type inference test, modified @author list * fixed checkstyle error
1 parent 5fa31c3 commit 1997c76

File tree

3 files changed

+26
-15
lines changed

3 files changed

+26
-15
lines changed

spring-kafka/src/main/java/org/springframework/kafka/support/serializer/JsonDeserializer.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
* @author Yanming Zhou
5454
* @author Elliot Kennedy
5555
* @author Torsten Schleede
56+
* @author Ivan Ponomarev
5657
*/
5758
public class JsonDeserializer<T> implements ExtendedDeserializer<T> {
5859

@@ -138,7 +139,7 @@ public JsonDeserializer(ObjectMapper objectMapper) {
138139
* {@link ObjectMapper}.
139140
* @param targetType the target type to use if no type info headers are present.
140141
*/
141-
public JsonDeserializer(Class<T> targetType) {
142+
public JsonDeserializer(Class<? super T> targetType) {
142143
this(targetType, true);
143144
}
144145

@@ -150,7 +151,7 @@ public JsonDeserializer(Class<T> targetType) {
150151
* type if not.
151152
* @since 2.2
152153
*/
153-
public JsonDeserializer(Class<T> targetType, boolean useHeadersIfPresent) {
154+
public JsonDeserializer(Class<? super T> targetType, boolean useHeadersIfPresent) {
154155
this(targetType, new ObjectMapper(), useHeadersIfPresent, om -> {
155156
om.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);
156157
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
@@ -162,7 +163,7 @@ public JsonDeserializer(Class<T> targetType, boolean useHeadersIfPresent) {
162163
* @param targetType the target type to use if no type info headers are present.
163164
* @param objectMapper the mapper. type if not.
164165
*/
165-
public JsonDeserializer(Class<T> targetType, ObjectMapper objectMapper) {
166+
public JsonDeserializer(Class<? super T> targetType, ObjectMapper objectMapper) {
166167
this(targetType, objectMapper, true);
167168
}
168169

@@ -175,17 +176,17 @@ public JsonDeserializer(Class<T> targetType, ObjectMapper objectMapper) {
175176
* type if not.
176177
* @since 2.2
177178
*/
178-
public JsonDeserializer(@Nullable Class<T> targetType, ObjectMapper objectMapper, boolean useHeadersIfPresent) {
179+
public JsonDeserializer(@Nullable Class<? super T> targetType, ObjectMapper objectMapper, boolean useHeadersIfPresent) {
179180
this(targetType, objectMapper, useHeadersIfPresent, om -> { });
180181
}
181182

182183
@SuppressWarnings("unchecked")
183-
private JsonDeserializer(@Nullable Class<T> targetType, ObjectMapper objectMapper, boolean useHeadersIfPresent,
184+
private JsonDeserializer(@Nullable Class<? super T> targetType, ObjectMapper objectMapper, boolean useHeadersIfPresent,
184185
Consumer<ObjectMapper> configurer) {
185186

186187
Assert.notNull(objectMapper, "'objectMapper' must not be null.");
187188
this.objectMapper = objectMapper;
188-
this.targetType = targetType;
189+
this.targetType = (Class<T>) targetType;
189190
if (this.targetType == null) {
190191
this.targetType = (Class<T>) ResolvableType.forClass(getClass()).getSuperType().resolveGeneric(0);
191192
}

spring-kafka/src/main/java/org/springframework/kafka/support/serializer/JsonSerde.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2017-2018 the original author or authors.
2+
* Copyright 2017-2019 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -42,6 +42,7 @@
4242
* @author Marius Bogoevici
4343
* @author Elliot Kennedy
4444
* @author Gary Russell
45+
* @author Ivan Ponomarev
4546
*
4647
* @since 1.1.5
4748
*/
@@ -55,7 +56,7 @@ public JsonSerde() {
5556
this((ObjectMapper) null);
5657
}
5758

58-
public JsonSerde(Class<T> targetType) {
59+
public JsonSerde(Class<? super T> targetType) {
5960
this(targetType, null);
6061
}
6162

@@ -64,9 +65,9 @@ public JsonSerde(ObjectMapper objectMapper) {
6465
}
6566

6667
@SuppressWarnings("unchecked")
67-
public JsonSerde(@Nullable Class<T> targetTypeArg, @Nullable ObjectMapper objectMapperArg) {
68+
public JsonSerde(@Nullable Class<? super T> targetTypeArg, @Nullable ObjectMapper objectMapperArg) {
6869
ObjectMapper objectMapper = objectMapperArg;
69-
Class<T> targetType = targetTypeArg;
70+
Class<T> targetType = (Class<T>) targetTypeArg;
7071
if (objectMapper == null) {
7172
objectMapper = new ObjectMapper();
7273
objectMapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, false);

spring-kafka/src/test/java/org/springframework/kafka/support/serializer/JsonSerializationTests.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
* @author Yanming Zhou
4747
* @author Torsten Schleede
4848
* @author Gary Russell
49+
* @author Ivan Ponomarev
4950
*/
5051
public class JsonSerializationTests {
5152

@@ -83,18 +84,18 @@ public void init() {
8384
topic = "topic-name";
8485

8586
jsonReader = new JsonDeserializer<DummyEntity>() { };
86-
jsonReader.configure(new HashMap<String, Object>(), false);
87+
jsonReader.configure(new HashMap<>(), false);
8788
jsonReader.close(); // does nothing, so may be called any time, or not called at all
8889
jsonArrayReader = new JsonDeserializer<DummyEntity[]>() { };
89-
jsonArrayReader.configure(new HashMap<String, Object>(), false);
90+
jsonArrayReader.configure(new HashMap<>(), false);
9091
jsonArrayReader.close(); // does nothing, so may be called any time, or not called at all
9192
jsonWriter = new JsonSerializer<>();
92-
jsonWriter.configure(new HashMap<String, Object>(), false);
93+
jsonWriter.configure(new HashMap<>(), false);
9394
jsonWriter.close(); // does nothing, so may be called any time, or not called at all
9495
stringReader = new StringDeserializer();
95-
stringReader.configure(new HashMap<String, Object>(), false);
96+
stringReader.configure(new HashMap<>(), false);
9697
stringWriter = new StringSerializer();
97-
stringWriter.configure(new HashMap<String, Object>(), false);
98+
stringWriter.configure(new HashMap<>(), false);
9899
dummyEntityJsonDeserializer = new DummyEntityJsonDeserializer();
99100
dummyEntityArrayJsonDeserializer = new DummyEntityArrayJsonDeserializer();
100101
}
@@ -203,6 +204,14 @@ public void testDeserTypeHeadersConfig() {
203204
.isEqualTo(TypePrecedence.INFERRED);
204205
}
205206

207+
@Test
208+
public void testDeserializerTypeInference() {
209+
JsonSerializer<List<String>> ser = new JsonSerializer<>();
210+
JsonDeserializer<List<String>> de = new JsonDeserializer<>(List.class);
211+
List<String> dummy = Arrays.asList("foo", "bar", "baz");
212+
assertThat(de.deserialize(topic, ser.serialize(topic, dummy))).isEqualTo(dummy);
213+
}
214+
206215
static class DummyEntityJsonDeserializer extends JsonDeserializer<DummyEntity> {
207216

208217
}

0 commit comments

Comments
 (0)