Skip to content
This repository was archived by the owner on May 28, 2018. It is now read-only.

Commit 9a60c00

Browse files
committed
Merge pull request #134 from lasselasse/moxyjson-nested-generics
Add support for nested generics to ConfigurableMoxyJsonProvider
2 parents 303742e + 73d48e4 commit 9a60c00

File tree

1 file changed

+45
-0
lines changed

1 file changed

+45
-0
lines changed

media/moxy/src/main/java/org/glassfish/jersey/moxy/json/internal/ConfigurableMoxyJsonProvider.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@
4343
import java.lang.reflect.Field;
4444
import java.lang.reflect.Modifier;
4545
import java.lang.reflect.Type;
46+
import java.lang.reflect.ParameterizedType;
47+
import java.lang.reflect.WildcardType;
48+
import java.lang.reflect.GenericArrayType;
4649
import java.security.AccessController;
4750
import java.util.Map;
4851
import java.util.Set;
@@ -59,6 +62,7 @@
5962
import javax.xml.bind.Marshaller;
6063
import javax.xml.bind.PropertyException;
6164
import javax.xml.bind.Unmarshaller;
65+
import javax.xml.bind.JAXBElement;
6266

6367
import org.glassfish.jersey.internal.util.ReflectionHelper;
6468
import org.glassfish.jersey.moxy.json.MoxyJsonConfig;
@@ -205,4 +209,45 @@ private boolean isPrimitiveType(final Class<?> type) {
205209
|| CoreClassConstants.PBOOLEAN == type || CoreClassConstants.BOOLEAN == type
206210
|| CoreClassConstants.PBYTE == type || CoreClassConstants.BYTE == type;
207211
}
212+
213+
@Override
214+
protected Class<?> getDomainClass(Type genericType) {
215+
if(null == genericType) {
216+
return Object.class;
217+
}
218+
if(genericType instanceof Class && genericType != JAXBElement.class) {
219+
Class<?> clazz = (Class<?>) genericType;
220+
if(clazz.isArray()) {
221+
return getDomainClass(clazz.getComponentType());
222+
}
223+
return clazz;
224+
} else if(genericType instanceof ParameterizedType) {
225+
Type type = ((ParameterizedType) genericType).getActualTypeArguments()[0];
226+
if(type instanceof ParameterizedType) {
227+
Type rawType = ((ParameterizedType) type).getRawType();
228+
if(rawType == JAXBElement.class) {
229+
return getDomainClass(type);
230+
} else if (rawType instanceof Class) {
231+
return (Class<?>) rawType;
232+
}
233+
} else if(type instanceof WildcardType) {
234+
Type[] upperTypes = ((WildcardType)type).getUpperBounds();
235+
if(upperTypes.length > 0){
236+
Type upperType = upperTypes[0];
237+
if(upperType instanceof Class){
238+
return (Class<?>) upperType;
239+
}
240+
}
241+
} else if(JAXBElement.class == type) {
242+
return Object.class;
243+
}
244+
return (Class<?>) type;
245+
} else if (genericType instanceof GenericArrayType) {
246+
GenericArrayType genericArrayType = (GenericArrayType) genericType;
247+
return getDomainClass(genericArrayType.getGenericComponentType());
248+
} else {
249+
return Object.class;
250+
}
251+
}
252+
208253
}

0 commit comments

Comments
 (0)