/** * Invokes all {@link ResourceProcessor} instances registered for the type of the given value and * reference type. * * @param value must not be {@literal null}. * @param referenceType must not be {@literal null}. * @return */ @SuppressWarnings("unchecked") public <T extends ResourceSupport> T invokeProcessorsFor(T value, ResolvableType referenceType) { Assert.notNull(value, "Value must not be null!"); Assert.notNull(referenceType, "Reference type must not be null!"); // For Resources implementations, process elements first if (ResourceProcessorHandlerMethodReturnValueHandler.RESOURCES_TYPE.isAssignableFrom( referenceType)) { Resources<?> resources = (Resources<?>) value; ResolvableType elementTargetType = ResolvableType.forClass(Resources.class, referenceType.getRawClass()).getGeneric(0); List<Object> result = new ArrayList<Object>(resources.getContent().size()); for (Object element : resources) { ResolvableType elementType = ResolvableType.forClass(element.getClass()); if (!getRawType(elementTargetType).equals(elementType.getRawClass())) { elementTargetType = elementType; } result.add(invokeProcessorsFor(element, elementTargetType)); } ReflectionUtils.setField( ResourceProcessorHandlerMethodReturnValueHandler.CONTENT_FIELD, resources, result); } return (T) invokeProcessorsFor((Object) value, referenceType); }
/* * (non-Javadoc) * @see org.springframework.data.rest.webmvc.ResourceProcessorHandlerMethodReturnValueHandler.DefaultProcessorWrapper#supports(org.springframework.core.ResolvableType, java.lang.Object) */ @Override public boolean supports(ResolvableType type, Object value) { if (!ResourceProcessorHandlerMethodReturnValueHandler.RESOURCES_TYPE.isAssignableFrom(type)) { return false; } return super.supports(type, value) && isValueTypeMatch((Resources<?>) value, getTargetType()); }