Register MVC validator with Spring Data REST HandlerAdapter.

Fixes: #967.
Original pull request: 2108.
This commit is contained in:
Oliver Drotbohm
2023-02-21 15:46:08 +01:00
parent 0bbc8c0f05
commit fdb9c660ee
2 changed files with 24 additions and 0 deletions

View File

@@ -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> validator,
@Qualifier("defaultMessageConverters") List<HttpMessageConverter<?>> 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));

View File

@@ -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