#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:
@@ -47,6 +47,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
|
|||||||
* Spring MVC HATEOAS Configuration
|
* Spring MVC HATEOAS Configuration
|
||||||
*
|
*
|
||||||
* @author Greg Turnquist
|
* @author Greg Turnquist
|
||||||
|
* @author Oliver Drotbohm
|
||||||
*/
|
*/
|
||||||
@Configuration
|
@Configuration
|
||||||
class WebMvcHateoasConfiguration {
|
class WebMvcHateoasConfiguration {
|
||||||
@@ -59,10 +60,16 @@ class WebMvcHateoasConfiguration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
HypermediaRepresentationModelBeanProcessorPostProcessor hypermediaRepresentionModelProcessorConfigurator(
|
RepresentationModelProcessorInvoker representationModelProcessorInvoker(
|
||||||
List<RepresentationModelProcessor<?>> processors) {
|
List<RepresentationModelProcessor<?>> processors) {
|
||||||
|
return new RepresentationModelProcessorInvoker(processors);
|
||||||
|
}
|
||||||
|
|
||||||
return new HypermediaRepresentationModelBeanProcessorPostProcessor(processors);
|
@Bean
|
||||||
|
static HypermediaRepresentationModelBeanProcessorPostProcessor hypermediaRepresentionModelProcessorConfigurator(
|
||||||
|
ObjectProvider<RepresentationModelProcessorInvoker> invoker) {
|
||||||
|
|
||||||
|
return new HypermediaRepresentationModelBeanProcessorPostProcessor(invoker);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
@@ -107,12 +114,18 @@ class WebMvcHateoasConfiguration {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Greg Turnquist
|
* @author Greg Turnquist
|
||||||
|
* @author Oliver Drotbohm
|
||||||
*/
|
*/
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
static class HypermediaRepresentationModelBeanProcessorPostProcessor implements BeanPostProcessor {
|
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
|
@Override
|
||||||
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
|
||||||
|
|
||||||
@@ -124,7 +137,7 @@ class WebMvcHateoasConfiguration {
|
|||||||
delegate.addHandlers(adapter.getReturnValueHandlers());
|
delegate.addHandlers(adapter.getReturnValueHandlers());
|
||||||
|
|
||||||
RepresentationModelProcessorHandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(
|
RepresentationModelProcessorHandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(
|
||||||
delegate, new RepresentationModelProcessorInvoker(processors));
|
delegate, () -> invoker.getObject());
|
||||||
|
|
||||||
adapter.setReturnValueHandlers(Collections.singletonList(handler));
|
adapter.setReturnValueHandlers(Collections.singletonList(handler));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor;
|
|||||||
|
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
import org.springframework.core.MethodParameter;
|
import org.springframework.core.MethodParameter;
|
||||||
import org.springframework.core.ResolvableType;
|
import org.springframework.core.ResolvableType;
|
||||||
@@ -60,7 +61,7 @@ public class RepresentationModelProcessorHandlerMethodReturnValueHandler impleme
|
|||||||
}
|
}
|
||||||
|
|
||||||
private final @NonNull HandlerMethodReturnValueHandler delegate;
|
private final @NonNull HandlerMethodReturnValueHandler delegate;
|
||||||
private final @NonNull RepresentationModelProcessorInvoker invoker;
|
private final @NonNull Supplier<RepresentationModelProcessorInvoker> invoker;
|
||||||
|
|
||||||
private boolean rootLinksAsHeaders = false;
|
private boolean rootLinksAsHeaders = false;
|
||||||
|
|
||||||
@@ -122,7 +123,7 @@ public class RepresentationModelProcessorHandlerMethodReturnValueHandler impleme
|
|||||||
targetType = returnValueType;
|
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);
|
delegate.handleReturnValue(rewrapResult(result, returnValue), returnType, mavContainer, webRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.springframework.hateoas.server.mvc;
|
|||||||
import static java.util.Collections.*;
|
import static java.util.Collections.*;
|
||||||
import static org.assertj.core.api.Assertions.*;
|
import static org.assertj.core.api.Assertions.*;
|
||||||
import static org.mockito.ArgumentMatchers.*;
|
import static org.mockito.ArgumentMatchers.*;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.*;
|
import static org.mockito.Mockito.*;
|
||||||
import static org.springframework.util.ReflectionUtils.*;
|
import static org.springframework.util.ReflectionUtils.*;
|
||||||
|
|
||||||
@@ -253,7 +254,7 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest {
|
|||||||
MethodParameter parameter = METHOD_PARAMS.get("resource");
|
MethodParameter parameter = METHOD_PARAMS.get("resource");
|
||||||
|
|
||||||
RepresentationModelProcessorHandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(
|
RepresentationModelProcessorHandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(
|
||||||
delegate, new RepresentationModelProcessorInvoker(resourceProcessors));
|
delegate, () -> new RepresentationModelProcessorInvoker(resourceProcessors));
|
||||||
handler.setRootLinksAsHeaders(true);
|
handler.setRootLinksAsHeaders(true);
|
||||||
handler.handleReturnValue(mapper.apply(resource), parameter, null, null);
|
handler.handleReturnValue(mapper.apply(resource), parameter, null, null);
|
||||||
|
|
||||||
@@ -299,7 +300,7 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest {
|
|||||||
resourceProcessors.add((RepresentationModelProcessor<?>) factory.getProxy());
|
resourceProcessors.add((RepresentationModelProcessor<?>) factory.getProxy());
|
||||||
|
|
||||||
new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate,
|
new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate,
|
||||||
new RepresentationModelProcessorInvoker(resourceProcessors));
|
() -> new RepresentationModelProcessorInvoker(resourceProcessors));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -322,7 +323,7 @@ class ResourceProcessorHandlerMethodReturnValueHandlerUnitTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
HandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate,
|
HandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate,
|
||||||
new RepresentationModelProcessorInvoker(resourceProcessors));
|
() -> new RepresentationModelProcessorInvoker(resourceProcessors));
|
||||||
handler.handleReturnValue(returnValue, methodParam, null, null);
|
handler.handleReturnValue(returnValue, methodParam, null, null);
|
||||||
|
|
||||||
verify(delegate, times(1)).handleReturnValue(expected, 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);
|
when(delegate.supportsReturnType(Mockito.any(MethodParameter.class))).thenReturn(value);
|
||||||
|
|
||||||
HandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate,
|
HandlerMethodReturnValueHandler handler = new RepresentationModelProcessorHandlerMethodReturnValueHandler(delegate,
|
||||||
new RepresentationModelProcessorInvoker(resourceProcessors));
|
() -> new RepresentationModelProcessorInvoker(resourceProcessors));
|
||||||
|
|
||||||
assertThat(handler.supportsReturnType(parameter)).isEqualTo(value);
|
assertThat(handler.supportsReturnType(parameter)).isEqualTo(value);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user