@@ -202,12 +202,7 @@ private Type findSearchReturnType(MethodResourceMapping methodResourceMapping, C
202
202
}
203
203
else if (ResolvableType .forType (returnRepoType ).getRawClass () != null
204
204
&& Iterable .class .isAssignableFrom (Objects .requireNonNull (ResolvableType .forType (returnRepoType ).getRawClass ()))) {
205
-
206
- if (methodResourceMapping .isPagingResource ())
207
- return resolveGenericType (PagedModel .class , EntityModel .class , domainType );
208
- else
209
- return resolveGenericType (CollectionModel .class , EntityModel .class , domainType );
210
-
205
+ return getTypeForCollectionModel (domainType , methodResourceMapping .isPagingResource ());
211
206
}
212
207
else if (ClassUtils .isPrimitiveOrWrapper (methodResourceMapping .getReturnedDomainType ())) {
213
208
returnType = methodResourceMapping .getReturnedDomainType ();
@@ -234,30 +229,7 @@ private Type getType(MethodParameter methodParameterReturn, RequestMethod reques
234
229
if (returnType instanceof ParameterizedType ) {
235
230
ParameterizedType parameterizedType = (ParameterizedType ) returnType ;
236
231
if ((ResponseEntity .class .equals (parameterizedType .getRawType ()))) {
237
- if (Object .class .equals (parameterizedType .getActualTypeArguments ()[0 ])) {
238
- return ResolvableType .forClassWithGenerics (ResponseEntity .class , returnedEntityType ).getType ();
239
- }
240
- else if (parameterizedType .getActualTypeArguments ()[0 ] instanceof ParameterizedType ) {
241
- ParameterizedType parameterizedType1 = (ParameterizedType ) parameterizedType .getActualTypeArguments ()[0 ];
242
- Class <?> rawType = ResolvableType .forType (parameterizedType1 .getRawType ()).getRawClass ();
243
- if (rawType != null && rawType .isAssignableFrom (RepresentationModel .class )) {
244
- Class <?> type = findType (requestMethod , dataRestRepository );
245
- return resolveGenericType (ResponseEntity .class , type , returnedEntityType );
246
- }
247
- else if (EntityModel .class .equals (parameterizedType1 .getRawType ())) {
248
- return resolveGenericType (ResponseEntity .class , EntityModel .class , returnedEntityType );
249
- }
250
- }
251
- else if (parameterizedType .getActualTypeArguments ()[0 ] instanceof WildcardType ) {
252
- WildcardType wildcardType = (WildcardType ) parameterizedType .getActualTypeArguments ()[0 ];
253
- if (wildcardType .getUpperBounds ()[0 ] instanceof ParameterizedType ) {
254
- ParameterizedType wildcardTypeUpperBound = (ParameterizedType ) wildcardType .getUpperBounds ()[0 ];
255
- if (RepresentationModel .class .equals (wildcardTypeUpperBound .getRawType ())) {
256
- Class <?> type = findType (requestMethod , dataRestRepository );
257
- return resolveGenericType (ResponseEntity .class , type , returnedEntityType );
258
- }
259
- }
260
- }
232
+ return getTypeForResponseEntity (requestMethod , dataRestRepository , returnedEntityType , parameterizedType );
261
233
}
262
234
else if ((HttpEntity .class .equals (parameterizedType .getRawType ())
263
235
&& parameterizedType .getActualTypeArguments ()[0 ] instanceof ParameterizedType )) {
@@ -268,15 +240,92 @@ else if ((HttpEntity.class.equals(parameterizedType.getRawType())
268
240
}
269
241
else if ((CollectionModel .class .equals (parameterizedType .getRawType ())
270
242
&& Object .class .equals (parameterizedType .getActualTypeArguments ()[0 ]))) {
271
- if (resourceMetadata .isPagingResource ())
272
- return resolveGenericType (PagedModel .class , EntityModel .class , returnedEntityType );
273
- else
274
- return resolveGenericType (CollectionModel .class , EntityModel .class , returnedEntityType );
243
+ return getTypeForCollectionModel (returnedEntityType , resourceMetadata .isPagingResource ());
275
244
}
276
245
}
277
246
return returnType ;
278
247
}
279
248
249
+ /**
250
+ * Gets type for response entity.
251
+ *
252
+ * @param requestMethod the request method
253
+ * @param dataRestRepository the data rest repository
254
+ * @param returnedEntityType the returned entity type
255
+ * @param parameterizedType the parameterized type
256
+ * @return the type for response entity
257
+ */
258
+ private Type getTypeForResponseEntity (RequestMethod requestMethod , DataRestRepository dataRestRepository , Class returnedEntityType , ParameterizedType parameterizedType ) {
259
+ if (Object .class .equals (parameterizedType .getActualTypeArguments ()[0 ])) {
260
+ return ResolvableType .forClassWithGenerics (ResponseEntity .class , returnedEntityType ).getType ();
261
+ }
262
+ else if (parameterizedType .getActualTypeArguments ()[0 ] instanceof ParameterizedType ) {
263
+ return getTypeForParameterizedType (requestMethod , dataRestRepository , returnedEntityType , parameterizedType );
264
+ }
265
+ else if (parameterizedType .getActualTypeArguments ()[0 ] instanceof WildcardType ) {
266
+ Type type = getTypeForWildcardType (requestMethod , dataRestRepository , returnedEntityType , parameterizedType );
267
+ if (type != null ) return type ;
268
+ }
269
+ return null ;
270
+ }
271
+
272
+ /**
273
+ * Gets type for collection model.
274
+ *
275
+ * @param returnedEntityType the returned entity type
276
+ * @param pagingResource the paging resource
277
+ * @return the type for collection model
278
+ */
279
+ private Type getTypeForCollectionModel (Class returnedEntityType , boolean pagingResource ) {
280
+ if (pagingResource )
281
+ return resolveGenericType (PagedModel .class , EntityModel .class , returnedEntityType );
282
+ else
283
+ return resolveGenericType (CollectionModel .class , EntityModel .class , returnedEntityType );
284
+ }
285
+
286
+ /**
287
+ * Gets type for wildcard type.
288
+ *
289
+ * @param requestMethod the request method
290
+ * @param dataRestRepository the data rest repository
291
+ * @param returnedEntityType the returned entity type
292
+ * @param parameterizedType the parameterized type
293
+ * @return the type for wildcard type
294
+ */
295
+ private Type getTypeForWildcardType (RequestMethod requestMethod , DataRestRepository dataRestRepository , Class returnedEntityType , ParameterizedType parameterizedType ) {
296
+ WildcardType wildcardType = (WildcardType ) parameterizedType .getActualTypeArguments ()[0 ];
297
+ if (wildcardType .getUpperBounds ()[0 ] instanceof ParameterizedType ) {
298
+ ParameterizedType wildcardTypeUpperBound = (ParameterizedType ) wildcardType .getUpperBounds ()[0 ];
299
+ if (RepresentationModel .class .equals (wildcardTypeUpperBound .getRawType ())) {
300
+ Class <?> type = findType (requestMethod , dataRestRepository );
301
+ return resolveGenericType (ResponseEntity .class , type , returnedEntityType );
302
+ }
303
+ }
304
+ return null ;
305
+ }
306
+
307
+ /**
308
+ * Gets type.
309
+ *
310
+ * @param requestMethod the request method
311
+ * @param dataRestRepository the data rest repository
312
+ * @param returnedEntityType the returned entity type
313
+ * @param parameterizedType the parameterized type
314
+ * @return the type
315
+ */
316
+ private Type getTypeForParameterizedType (RequestMethod requestMethod , DataRestRepository dataRestRepository , Class returnedEntityType , ParameterizedType parameterizedType ) {
317
+ ParameterizedType parameterizedType1 = (ParameterizedType ) parameterizedType .getActualTypeArguments ()[0 ];
318
+ Class <?> rawType = ResolvableType .forType (parameterizedType1 .getRawType ()).getRawClass ();
319
+ if (rawType != null && rawType .isAssignableFrom (RepresentationModel .class )) {
320
+ Class <?> type = findType (requestMethod , dataRestRepository );
321
+ return resolveGenericType (ResponseEntity .class , type , returnedEntityType );
322
+ }
323
+ else if (EntityModel .class .equals (parameterizedType1 .getRawType ())) {
324
+ return resolveGenericType (ResponseEntity .class , EntityModel .class , returnedEntityType );
325
+ }
326
+ return null ;
327
+ }
328
+
280
329
/**
281
330
* Find type class.
282
331
*
0 commit comments