From fdb9c660eecdbc2a0fa4f9c50b96ca8d82a44145 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 21 Feb 2023 15:46:08 +0100 Subject: [PATCH] Register MVC validator with Spring Data REST HandlerAdapter. Fixes: #967. Original pull request: 2108. --- .../RepositoryRestMvcConfiguration.java | 3 +++ ...ryRestMvConfigurationIntegrationTests.java | 21 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java index 01e6d5d2f..58089be9f 100644 --- a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvcConfiguration.java @@ -121,6 +121,7 @@ import org.springframework.http.server.ServerHttpRequest; import org.springframework.plugin.core.PluginRegistry; import org.springframework.util.ClassUtils; import org.springframework.util.StringValueResolver; +import org.springframework.validation.Validator; import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -653,6 +654,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon */ @Bean public RequestMappingHandlerAdapter repositoryExporterHandlerAdapter( + @Qualifier("mvcValidator") ObjectProvider validator, @Qualifier("defaultMessageConverters") List> defaultMessageConverters, AlpsJsonHttpMessageConverter alpsJsonHttpMessageConverter, SelfLinkProvider selfLinkProvider, PersistentEntityResourceHandlerMethodArgumentResolver persistentEntityArgumentResolver, @@ -662,6 +664,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon // Forward conversion service to handler adapter ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer(); initializer.setConversionService(defaultConversionService); + initializer.setValidator(validator.getIfUnique()); RepositoryRestHandlerAdapter handlerAdapter = new RepositoryRestHandlerAdapter(defaultMethodArgumentResolvers( selfLinkProvider, persistentEntityArgumentResolver, repoRequestArgumentResolver)); diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java index 3f6926eef..cfbcc5b06 100755 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/RepositoryRestMvConfigurationIntegrationTests.java @@ -44,6 +44,7 @@ import org.springframework.data.domain.Sort.Direction; import org.springframework.data.geo.Distance; import org.springframework.data.geo.Point; import org.springframework.data.rest.webmvc.RepositoryLinksResource; +import org.springframework.data.rest.webmvc.RepositoryRestHandlerAdapter; import org.springframework.data.rest.webmvc.RestMediaTypes; import org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter; import org.springframework.data.rest.webmvc.json.PersistentEntityJackson2Module; @@ -61,6 +62,9 @@ import org.springframework.http.converter.json.AbstractJackson2HttpMessageConver import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.test.util.ReflectionTestUtils; import org.springframework.util.MultiValueMap; +import org.springframework.validation.Validator; +import org.springframework.validation.beanvalidation.OptionalValidatorFactoryBean; +import org.springframework.web.bind.support.ConfigurableWebBindingInitializer; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; import org.springframework.web.util.UriComponentsBuilder; @@ -193,6 +197,18 @@ class RepositoryRestMvConfigurationIntegrationTests { assertThat(service.canConvert(Distance.class, String.class)).isTrue(); } + @Test // DATAREST-593 / #967 + void assertValidatorSupportWorkingCorrectly() { + + RepositoryRestHandlerAdapter repositoryRestHandlerAdapter = context.getBean("repositoryExporterHandlerAdapter", + RepositoryRestHandlerAdapter.class); + + ConfigurableWebBindingInitializer configurableWebBindingInitializer = (ConfigurableWebBindingInitializer) repositoryRestHandlerAdapter + .getWebBindingInitializer(); + + assertThat(configurableWebBindingInitializer.getValidator()).isNotNull(); + } + @Test // DATAREST-1198 void hasConvertersForNamAndLdapName() { @@ -313,6 +329,11 @@ class RepositoryRestMvConfigurationIntegrationTests { } }; } + + @Bean + Validator mvcValidator() { + return new OptionalValidatorFactoryBean(); + } } @Configuration