Skip to content

Commit 3c8f254

Browse files
committed
修复无法序列化List泛型问题
1 parent 2c8f12d commit 3c8f254

File tree

2 files changed

+50
-6
lines changed

2 files changed

+50
-6
lines changed

hsweb-starter/src/main/java/org/hswebframework/web/starter/jackson/CustomJackson2JsonDecoder.java

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.io.IOException;
3333
import java.lang.annotation.Annotation;
3434
import java.lang.reflect.Type;
35+
import java.util.Collection;
3536
import java.util.List;
3637
import java.util.Map;
3738

@@ -120,17 +121,33 @@ public Object decode(@NonNull DataBuffer dataBuffer, @NonNull ResolvableType tar
120121
}
121122
}
122123

124+
private Type getRelType(Type type) {
125+
if (type instanceof Class) {
126+
Class<?> realType = entityFactory.getInstanceType(((Class<?>) type), false);
127+
if (realType != null) {
128+
return realType;
129+
}
130+
}
131+
return type;
132+
}
133+
123134
private ObjectReader getObjectReader(ResolvableType elementType, @Nullable Map<String, Object> hints) {
124135
Assert.notNull(elementType, "'elementType' must not be null");
125136
MethodParameter param = getParameter(elementType);
126137
Class<?> contextClass = (param != null ? param.getContainingClass() : null);
127138
Type type = elementType.resolve() == null ? elementType.getType() : elementType.toClass();
128-
if (type instanceof Class) {
129-
Class<?> realType = entityFactory.getInstanceType(((Class<?>) type), false);
130-
if (realType != null) {
131-
type = realType;
132-
}
139+
140+
if (Iterable.class.isAssignableFrom(elementType.toClass())) {
141+
ResolvableType genType = elementType.getGeneric(0);
142+
type = ResolvableType
143+
.forClassWithGenerics(
144+
elementType.toClass(),
145+
ResolvableType.forType(getRelType(genType.getType())))
146+
.getType();
147+
} else {
148+
type = getRelType(type);
133149
}
150+
134151
JavaType javaType = getJavaType(type, contextClass);
135152
Class<?> jsonView = (hints != null ? (Class<?>) hints.get(Jackson2CodecSupport.JSON_VIEW_HINT) : null);
136153
return jsonView != null ?

hsweb-starter/src/test/java/org/hswebframework/web/starter/jackson/CustomJackson2JsonDecoderTest.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.hswebframework.web.starter.jackson;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import lombok.Getter;
5+
import lombok.Setter;
46
import lombok.SneakyThrows;
57
import org.hswebframework.web.api.crud.entity.EntityFactory;
68
import org.hswebframework.web.api.crud.entity.QueryParamEntity;
@@ -17,6 +19,7 @@
1719
import reactor.core.publisher.Mono;
1820

1921
import java.util.Collections;
22+
import java.util.List;
2023

2124
import static org.junit.Assert.*;
2225

@@ -28,7 +31,7 @@ public void testDecodeCustomType() {
2831

2932
MapperEntityFactory entityFactory = new MapperEntityFactory();
3033

31-
entityFactory.addMapping(QueryParamEntity.class,MapperEntityFactory.defaultMapper(CustomQueryParamEntity.class));
34+
entityFactory.addMapping(QueryParamEntity.class, MapperEntityFactory.defaultMapper(CustomQueryParamEntity.class));
3235

3336

3437
ObjectMapper mapper = new ObjectMapper();
@@ -46,6 +49,30 @@ public void testDecodeCustomType() {
4649

4750
}
4851

52+
@Test
53+
@SneakyThrows
54+
public void testDecodeList() {
55+
ObjectMapper mapper = new ObjectMapper();
56+
CustomJackson2JsonDecoder decoder = new CustomJackson2JsonDecoder(new MapperEntityFactory(), mapper);
57+
58+
ResolvableType type = ResolvableType.forClassWithGenerics(List.class, MyEntity.class);
59+
DataBuffer buffer = new DefaultDataBufferFactory().wrap("[{\"id\":\"test\"}]".getBytes());
60+
61+
Object object = decoder.decode(buffer, type, MediaType.APPLICATION_JSON, Collections.emptyMap());
62+
63+
assertTrue(object instanceof List);
64+
assertTrue(((List<?>) object).size() > 0);
65+
assertTrue(((List<?>) object).get(0) instanceof MyEntity);
66+
assertEquals(((MyEntity) ((List<?>) object).get(0)).getId(), "test");
67+
68+
}
69+
70+
@Getter
71+
@Setter
72+
public static class MyEntity {
73+
private String id;
74+
}
75+
4976
public static class CustomQueryParamEntity extends QueryParamEntity {
5077

5178
}

0 commit comments

Comments
 (0)