#998 - WebMvcHateoasConfiguration now delays a beans-of-type lookup.

We now delay the lookup of RepresentationModelProcessor instances in WebMvcHateoasConfiguration so that the BeanPostProcessor registered does now not trigger eager initialization of downstream beans.
This commit is contained in:
Oliver Drotbohm
2019-06-05 19:50:11 +02:00
parent c12ed413da
commit 6575a8ddae
3 changed files with 26 additions and 11 deletions

View File

@@ -47,6 +47,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
* Spring MVC HATEOAS Configuration
*
* @author Greg Turnquist
* @author Oliver Drotbohm
*/
@Configuration
class WebMvcHateoasConfiguration {
@@ -59,10 +60,16 @@ class WebMvcHateoasConfiguration {
}
@Bean
HypermediaRepresentationModelBeanProcessorPostProcessor hypermediaRepresentionModelProcessorConfigurator(
RepresentationModelProcessorInvoker representationModelProcessorInvoker(
List<RepresentationModelProcessor<?>> processors) {
return new RepresentationModelProcessorInvoker(processors);
}
return new HypermediaRepresentationModelBeanProcessorPostProcessor(processors);
@Bean
static HypermediaRepresentationModelBeanProcessorPostProcessor hypermediaRepresentionModelProcessorConfigurator(
ObjectProvider<RepresentationModelProcessorInvoker> invoker) {
return new HypermediaRepresentationModelBeanProcessorPostProcessor(invoker);
}
@Bean
@@ -107,12 +114,18 @@ class WebMvcHateoasConfiguration {
/**
* @author Greg Turnquist
* @author Oliver Drotbohm
*/
@RequiredArgsConstructor
static class HypermediaRepresentationModelBeanProcessorPostProcessor implements BeanPostProcessor {
private final List<RepresentationModelProcessor<?>> processors;
private final ObjectProvider<RepresentationModelProcessorInvoker> invoker;
/*
* (non-Javadoc)
* @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object, java.lang.String)
*/
@NonNull
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
@@ -124,7 +137,7 @@ class WebMvcHateoasConfiguration {
delegate.addHandlers(adapter.getReturnValueHandlers());
RepresentationModelProcessorHandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(
delegate, new RepresentationModelProcessorInvoker(processors));
delegate, () -> invoker.getObject());
adapter.setReturnValueHandlers(Collections.singletonList(handler));
}

View File

@@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.function.Supplier;
import org.springframework.core.MethodParameter;
import org.springframework.core.ResolvableType;
@@ -60,7 +61,7 @@ public class RepresentationModelProcessorHandlerMethodReturnValueHandler impleme
}
private final @NonNull HandlerMethodReturnValueHandler delegate;
private final @NonNull RepresentationModelProcessorInvoker invoker;
private final @NonNull Supplier<RepresentationModelProcessorInvoker> invoker;
private boolean rootLinksAsHeaders = false;
@@ -122,7 +123,7 @@ public class RepresentationModelProcessorHandlerMethodReturnValueHandler impleme
targetType = returnValueType;
}
RepresentationModel<?> result = invoker.invokeProcessorsFor((RepresentationModel) value, targetType);
RepresentationModel<?> result = invoker.get().invokeProcessorsFor((RepresentationModel) value, targetType);
delegate.handleReturnValue(rewrapResult(result, returnValue), returnType, mavContainer, webRequest);
}