diff --git a/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java index 11d52b05..2930f97b 100644 --- a/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/WebMvcHateoasConfiguration.java @@ -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> processors) { + return new RepresentationModelProcessorInvoker(processors); + } - return new HypermediaRepresentationModelBeanProcessorPostProcessor(processors); + @Bean + static HypermediaRepresentationModelBeanProcessorPostProcessor hypermediaRepresentionModelProcessorConfigurator( + ObjectProvider 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> processors; + private final ObjectProvider 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)); } diff --git a/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorHandlerMethodReturnValueHandler.java b/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorHandlerMethodReturnValueHandler.java index 8660cf7b..4738e586 100644 --- a/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorHandlerMethodReturnValueHandler.java +++ b/src/main/java/org/springframework/hateoas/server/mvc/RepresentationModelProcessorHandlerMethodReturnValueHandler.java @@ -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 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); } diff --git a/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java b/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java index 74de5f72..0cf43624 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/ResourceProcessorHandlerMethodReturnValueHandlerUnitTest.java @@ -18,6 +18,7 @@ package org.springframework.hateoas.server.mvc; import static java.util.Collections.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; import static org.springframework.util.ReflectionUtils.*; @@ -53,7 +54,7 @@ import org.springframework.web.method.support.HandlerMethodReturnValueHandler; /** * Unit tests for {@link RepresentationModelProcessorHandlerMethodReturnValueHandler}. - * + * * @author Oliver Gierke * @author Jon Brisbin */ @@ -253,7 +254,7 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest { MethodParameter parameter = METHOD_PARAMS.get("resource"); RepresentationModelProcessorHandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler( - delegate, new RepresentationModelProcessorInvoker(resourceProcessors)); + delegate, () -> new RepresentationModelProcessorInvoker(resourceProcessors)); handler.setRootLinksAsHeaders(true); handler.handleReturnValue(mapper.apply(resource), parameter, null, null); @@ -299,7 +300,7 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest { resourceProcessors.add((RepresentationModelProcessor) factory.getProxy()); new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate, - new RepresentationModelProcessorInvoker(resourceProcessors)); + () -> new RepresentationModelProcessorInvoker(resourceProcessors)); } /** @@ -322,7 +323,7 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest { } HandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate, - new RepresentationModelProcessorInvoker(resourceProcessors)); + () -> new RepresentationModelProcessorInvoker(resourceProcessors)); handler.handleReturnValue(returnValue, methodParam, null, null); verify(delegate, times(1)).handleReturnValue(expected, methodParam, null, null); @@ -334,7 +335,7 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest { when(delegate.supportsReturnType(Mockito.any(MethodParameter.class))).thenReturn(value); HandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate, - new RepresentationModelProcessorInvoker(resourceProcessors)); + () -> new RepresentationModelProcessorInvoker(resourceProcessors)); assertThat(handler.supportsReturnType(parameter)).isEqualTo(value); }