@@ -202,12 +202,7 @@ private Type findSearchReturnType(MethodResourceMapping methodResourceMapping, C
202202 }
203203 else if (ResolvableType .forType (returnRepoType ).getRawClass () != null
204204 && 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 ());
211206 }
212207 else if (ClassUtils .isPrimitiveOrWrapper (methodResourceMapping .getReturnedDomainType ())) {
213208 returnType = methodResourceMapping .getReturnedDomainType ();
@@ -234,30 +229,7 @@ private Type getType(MethodParameter methodParameterReturn, RequestMethod reques
234229 if (returnType instanceof ParameterizedType ) {
235230 ParameterizedType parameterizedType = (ParameterizedType ) returnType ;
236231 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 );
261233 }
262234 else if ((HttpEntity .class .equals (parameterizedType .getRawType ())
263235 && parameterizedType .getActualTypeArguments ()[0 ] instanceof ParameterizedType )) {
@@ -268,15 +240,92 @@ else if ((HttpEntity.class.equals(parameterizedType.getRawType())
268240 }
269241 else if ((CollectionModel .class .equals (parameterizedType .getRawType ())
270242 && 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 ());
275244 }
276245 }
277246 return returnType ;
278247 }
279248
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+
280329 /**
281330 * Find type class.
282331 *
0 commit comments