|
43 | 43 | import java.lang.reflect.Field; |
44 | 44 | import java.lang.reflect.Modifier; |
45 | 45 | import java.lang.reflect.Type; |
| 46 | +import java.lang.reflect.ParameterizedType; |
| 47 | +import java.lang.reflect.WildcardType; |
| 48 | +import java.lang.reflect.GenericArrayType; |
46 | 49 | import java.security.AccessController; |
47 | 50 | import java.util.Map; |
48 | 51 | import java.util.Set; |
|
59 | 62 | import javax.xml.bind.Marshaller; |
60 | 63 | import javax.xml.bind.PropertyException; |
61 | 64 | import javax.xml.bind.Unmarshaller; |
| 65 | +import javax.xml.bind.JAXBElement; |
62 | 66 |
|
63 | 67 | import org.glassfish.jersey.internal.util.ReflectionHelper; |
64 | 68 | import org.glassfish.jersey.moxy.json.MoxyJsonConfig; |
@@ -205,4 +209,45 @@ private boolean isPrimitiveType(final Class<?> type) { |
205 | 209 | || CoreClassConstants.PBOOLEAN == type || CoreClassConstants.BOOLEAN == type |
206 | 210 | || CoreClassConstants.PBYTE == type || CoreClassConstants.BYTE == type; |
207 | 211 | } |
| 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 | + |
208 | 253 | } |
0 commit comments