From 12121f842ef4c481af5b84e4d2a5d625baaee178 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 21 Jul 2015 12:53:31 +0200 Subject: [PATCH] DATAREST-621 - Introduced RepositoryRestConfigurer for less invasive customization of Spring Data REST. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now expose a RepositoryRestConfigurer interface that carries all configure… methods that exist on RepositoryRestMvcConfiguration. The latter are deprecated as of now in favor of implementing and declaring a RepositoryRestConfigurer bean (or extending RepositoryRestConfigurerAdapter for convenience). Moved extensions of RepositoryRestMvcConfiguration to RepositoryRestConfigurerAdapter where possible. --- .../config/RepositoryRestConfigurer.java | 79 +++++++++++ .../RepositoryRestConfigurerAdapter.java | 78 +++++++++++ .../RepositoryRestConfigurerDelegate.java | 123 ++++++++++++++++++ .../RepositoryRestMvcConfiguration.java | 74 ++++++++--- ...yRepresentationConfigIntegrationTests.java | 6 +- ...ryRestMvConfigurationIntegrationTests.java | 13 +- ...tEntityToJsonSchemaConverterUnitTests.java | 39 +++--- 7 files changed, 369 insertions(+), 43 deletions(-) create mode 100644 spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.java create mode 100644 spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerAdapter.java create mode 100644 spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerDelegate.java diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.java new file mode 100644 index 000000000..cd8ea5340 --- /dev/null +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurer.java @@ -0,0 +1,79 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.rest.webmvc.config; + +import java.util.List; + +import org.springframework.core.convert.support.ConfigurableConversionService; +import org.springframework.data.rest.core.config.RepositoryRestConfiguration; +import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Component to configure and customize the setup of Spring Data REST. + * + * @author Oliver Gierke + * @since 2.4 + * @soundtrack Florian Reichelt & Max Ender - Abschlusskonzert (https://www.youtube.com/watch?v=5WP0P-ndinY) + */ +public interface RepositoryRestConfigurer { + + /** + * Override this method to add additional configuration. + * + * @param config Main configuration bean. + */ + void configureRepositoryRestConfiguration(RepositoryRestConfiguration config); + + /** + * Override this method to add your own converters. + * + * @param conversionService Default ConversionService bean. + */ + void configureConversionService(ConfigurableConversionService conversionService); + + /** + * Override this method to add validators manually. + * + * @param validatingListener The {@link org.springframework.context.ApplicationListener} responsible for invoking + * {@link org.springframework.validation.Validator} instances. + */ + void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener); + + /** + * Configure the {@link ExceptionHandlerExceptionResolver}. + * + * @param exceptionResolver The default exception resolver on which you can add custom argument resolvers. + */ + void configureExceptionHandlerExceptionResolver(ExceptionHandlerExceptionResolver exceptionResolver); + + /** + * Configure the available {@link HttpMessageConverter}s by adding your own. + * + * @param messageConverters The converters to be used by the system. + */ + void configureHttpMessageConverters(List> messageConverters); + + /** + * Configure the Jackson {@link ObjectMapper} directly. + * + * @param objectMapper The {@literal ObjectMapper} to be used by the system. + */ + void configureJacksonObjectMapper(ObjectMapper objectMapper); +} diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerAdapter.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerAdapter.java new file mode 100644 index 000000000..69f0081d5 --- /dev/null +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerAdapter.java @@ -0,0 +1,78 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.rest.webmvc.config; + +import java.util.List; + +import org.springframework.core.convert.support.ConfigurableConversionService; +import org.springframework.data.rest.core.config.RepositoryRestConfiguration; +import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Convenience adapter for {@link RepositoryRestConfigurer} to allow selective override of configuration methods. + * + * @author Oliver Gierke + * @since 2.4 + * @soundtrack Florian Reichelt & Max Ender - Abschlusskonzert (https://www.youtube.com/watch?v=5WP0P-ndinY) + */ +public class RepositoryRestConfigurerAdapter implements RepositoryRestConfigurer { + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureRepositoryRestConfiguration(org.springframework.data.rest.core.config.RepositoryRestConfiguration) + */ + @Override + public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {} + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureConversionService(org.springframework.core.convert.support.ConfigurableConversionService) + */ + @Override + public void configureConversionService(ConfigurableConversionService conversionService) {} + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureValidatingRepositoryEventListener(org.springframework.data.rest.core.event.ValidatingRepositoryEventListener) + */ + @Override + public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {} + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureExceptionHandlerExceptionResolver(org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver) + */ + @Override + public void configureExceptionHandlerExceptionResolver(ExceptionHandlerExceptionResolver exceptionResolver) {} + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureHttpMessageConverters(java.util.List) + */ + @Override + public void configureHttpMessageConverters(List> messageConverters) {} + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureJacksonObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) + */ + @Override + public void configureJacksonObjectMapper(ObjectMapper objectMapper) {} +} diff --git a/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerDelegate.java b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerDelegate.java new file mode 100644 index 000000000..39c5c34a6 --- /dev/null +++ b/spring-data-rest-webmvc/src/main/java/org/springframework/data/rest/webmvc/config/RepositoryRestConfigurerDelegate.java @@ -0,0 +1,123 @@ +/* + * Copyright 2015 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.rest.webmvc.config; + +import java.util.List; + +import org.springframework.core.convert.support.ConfigurableConversionService; +import org.springframework.data.rest.core.config.RepositoryRestConfiguration; +import org.springframework.data.rest.core.event.ValidatingRepositoryEventListener; +import org.springframework.http.converter.HttpMessageConverter; +import org.springframework.util.Assert; +import org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver; + +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * Delegating implementation of {@link RepositoryRestConfigurer} that will forward all calls to configuration methods to + * all registered {@link RepositoryRestConfigurer}. + * + * @author Oliver Gierke + * @soundtrack Florian Reichelt & Max Ender - Abschlusskonzert (https://www.youtube.com/watch?v=5WP0P-ndinY) + */ +class RepositoryRestConfigurerDelegate implements RepositoryRestConfigurer { + + private final Iterable delegates; + + /** + * Creates a new {@link RepositoryRestConfigurerDelegate} for the given {@link RepositoryRestConfigurer}s. + * + * @param delegates must not be {@literal null}. + */ + public RepositoryRestConfigurerDelegate(Iterable delegates) { + + Assert.notNull(delegates, "RepositoryRestConfigurers must not be null!"); + + this.delegates = delegates; + } + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureRepositoryRestConfiguration(org.springframework.data.rest.core.config.RepositoryRestConfiguration) + */ + @Override + public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { + + for (RepositoryRestConfigurer configurer : delegates) { + configurer.configureRepositoryRestConfiguration(config); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureConversionService(org.springframework.core.convert.support.ConfigurableConversionService) + */ + @Override + public void configureConversionService(ConfigurableConversionService conversionService) { + + for (RepositoryRestConfigurer configurer : delegates) { + configurer.configureConversionService(conversionService); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureExceptionHandlerExceptionResolver(org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver) + */ + @Override + public void configureExceptionHandlerExceptionResolver(ExceptionHandlerExceptionResolver exceptionResolver) { + + for (RepositoryRestConfigurer configurer : delegates) { + configurer.configureExceptionHandlerExceptionResolver(exceptionResolver); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureHttpMessageConverters(java.util.List) + */ + @Override + public void configureHttpMessageConverters(List> messageConverters) { + + for (RepositoryRestConfigurer configurer : delegates) { + configurer.configureHttpMessageConverters(messageConverters); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureJacksonObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) + */ + @Override + public void configureJacksonObjectMapper(ObjectMapper objectMapper) { + + for (RepositoryRestConfigurer configurer : delegates) { + configurer.configureJacksonObjectMapper(objectMapper); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer#configureValidatingRepositoryEventListener(org.springframework.data.rest.core.event.ValidatingRepositoryEventListener) + */ + @Override + public void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) { + + for (RepositoryRestConfigurer configurer : delegates) { + configurer.configureValidatingRepositoryEventListener(validatingListener); + } + } +} 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 515293b31..07458405e 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 @@ -25,6 +25,7 @@ import java.util.Set; import org.springframework.beans.factory.BeanCreationException; import org.springframework.beans.factory.BeanFactoryUtils; +import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.ObjectFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -145,7 +146,7 @@ import com.fasterxml.jackson.databind.SerializationFeature; includeFilters = @Filter(BasePathAwareController.class) , useDefaultFilters = false) @ImportResource("classpath*:META-INF/spring-data-rest/**/*.xml") @Import(SpringDataJacksonConfiguration.class) -public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebConfiguration { +public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebConfiguration implements InitializingBean { private static final boolean IS_JPA_AVAILABLE = ClassUtils.isPresent("javax.persistence.EntityManager", RepositoryRestMvcConfiguration.class.getClassLoader()); @@ -153,10 +154,22 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon @Autowired ApplicationContext applicationContext; @Autowired(required = false) List idConverters = Collections.emptyList(); + @Autowired(required = false) List configurers = Collections.emptyList(); @Autowired(required = false) RelProvider relProvider; @Autowired(required = false) CurieProvider curieProvider; + private RepositoryRestConfigurerDelegate configurerDelegate; + + /* + * (non-Javadoc) + * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() + */ + @Override + public void afterPropertiesSet() throws Exception { + this.configurerDelegate = new RepositoryRestConfigurerDelegate(configurers); + } + @Bean public Repositories repositories() { return new Repositories(applicationContext); @@ -189,6 +202,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon conversionService.addConverter(uriToEntityConverter(conversionService)); addFormatters(conversionService); + configurerDelegate.configureConversionService(conversionService); configureConversionService(conversionService); return conversionService; @@ -200,8 +214,11 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon */ @Bean public ValidatingRepositoryEventListener validatingRepositoryEventListener(ObjectFactory repositories) { + ValidatingRepositoryEventListener listener = new ValidatingRepositoryEventListener(repositories); + configurerDelegate.configureValidatingRepositoryEventListener(listener); configureValidatingRepositoryEventListener(listener); + return listener; } @@ -228,6 +245,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon } RepositoryRestConfiguration config = new RepositoryRestConfiguration(configuration, metadataConfiguration()); + configurerDelegate.configureRepositoryRestConfiguration(config); configureRepositoryRestConfiguration(config); return config; @@ -328,11 +346,9 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon @Bean public PersistentEntityResourceHandlerMethodArgumentResolver persistentEntityArgumentResolver() { - List> messageConverters = defaultMessageConverters(); - configureHttpMessageConverters(messageConverters); - - return new PersistentEntityResourceHandlerMethodArgumentResolver(messageConverters, repoRequestArgumentResolver(), - backendIdHandlerMethodArgumentResolver(), new DomainObjectReader(persistentEntities(), resourceMappings())); + return new PersistentEntityResourceHandlerMethodArgumentResolver(defaultMessageConverters(), + repoRequestArgumentResolver(), backendIdHandlerMethodArgumentResolver(), + new DomainObjectReader(persistentEntities(), resourceMappings())); } /** @@ -473,11 +489,9 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon * @return */ @Bean + @SuppressWarnings("rawtypes") public RequestMappingHandlerAdapter repositoryExporterHandlerAdapter() { - List> messageConverters = defaultMessageConverters(); - configureHttpMessageConverters(messageConverters); - Collection beans = applicationContext.getBeansOfType(ResourceProcessor.class, false, false) .values(); List> processors = new ArrayList>(beans.size()); @@ -495,7 +509,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon RepositoryRestHandlerAdapter handlerAdapter = new RepositoryRestHandlerAdapter(defaultMethodArgumentResolvers(), processors); handlerAdapter.setWebBindingInitializer(initializer); - handlerAdapter.setMessageConverters(messageConverters); + handlerAdapter.setMessageConverters(defaultMessageConverters()); if (config().metadataConfiguration().alpsEnabled()) { handlerAdapter.setResponseBodyAdvice(Arrays.> asList(alpsJsonHttpMessageConverter())); @@ -546,8 +560,8 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon PersistentEntities entities = persistentEntities(); - return new PersistentEntityJackson2Module( - resourceMappings(), entities, config(), uriToEntityConverter(defaultConversionService()), entityLinks()); + return new PersistentEntityJackson2Module(resourceMappings(), entities, config(), + uriToEntityConverter(defaultConversionService()), entityLinks()); } /** @@ -565,13 +579,12 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon */ @Bean public ExceptionHandlerExceptionResolver exceptionHandlerExceptionResolver() { + ExceptionHandlerExceptionResolver er = new ExceptionHandlerExceptionResolver(); er.setCustomArgumentResolvers(defaultMethodArgumentResolvers()); + er.setMessageConverters(defaultMessageConverters()); - List> messageConverters = defaultMessageConverters(); - configureHttpMessageConverters(messageConverters); - - er.setMessageConverters(messageConverters); + configurerDelegate.configureExceptionHandlerExceptionResolver(er); configureExceptionHandlerExceptionResolver(er); return er; @@ -611,6 +624,9 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon messageConverters.add(fallbackJsonConverter); messageConverters.add(uriListHttpMessageConverter()); + configurerDelegate.configureHttpMessageConverters(messageConverters); + configureHttpMessageConverters(messageConverters); + return messageConverters; } @@ -697,6 +713,7 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon Jackson2DatatypeHelper.configureObjectMapper(objectMapper); // Configure custom Modules + configurerDelegate.configureJacksonObjectMapper(objectMapper); configureJacksonObjectMapper(objectMapper); return objectMapper; @@ -754,7 +771,8 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon // Register HAL browser if present - if (ClassUtils.isPresent("org.springframework.data.rest.webmvc.halbrowser.HalBrowser", getClass().getClassLoader())) { + if (ClassUtils.isPresent("org.springframework.data.rest.webmvc.halbrowser.HalBrowser", + getClass().getClassLoader())) { String basePath = config().getBasePath().toString().concat("/browser"); String rootLocation = "classpath:META-INF/spring-data-rest/hal-browser/"; @@ -792,14 +810,22 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon * Override this method to add additional configuration. * * @param config Main configuration bean. + * @deprecated since 2.4, implement + * {@link RepositoryRestConfigurer#configureRepositoryRestConfiguration(RepositoryRestConfiguration)} + * either directly or extend {@link RepositoryRestConfigurerAdapter} and override the method. */ + @Deprecated protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {} /** * Override this method to add your own converters. * * @param conversionService Default ConversionService bean. + * @deprecated since 2.4, implement + * {@link RepositoryRestConfigurer#configureConversionService(ConfigurableConversionService)} either + * directly or extend {@link RepositoryRestConfigurerAdapter} and override the method. */ + @Deprecated protected void configureConversionService(ConfigurableConversionService conversionService) {} /** @@ -807,27 +833,41 @@ public class RepositoryRestMvcConfiguration extends HateoasAwareSpringDataWebCon * * @param validatingListener The {@link org.springframework.context.ApplicationListener} responsible for invoking * {@link org.springframework.validation.Validator} instances. + * @deprecated since 2.4, implement + * {@link RepositoryRestConfigurer#configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener)} + * either directly or extend {@link RepositoryRestConfigurerAdapter} and override the method. */ + @Deprecated protected void configureValidatingRepositoryEventListener(ValidatingRepositoryEventListener validatingListener) {} /** * Configure the {@link ExceptionHandlerExceptionResolver}. * * @param exceptionResolver The default exception resolver on which you can add custom argument resolvers. + * @deprecated since 2.4, implement + * {@link RepositoryRestConfigurer#configureExceptionHandlerExceptionResolver(ExceptionHandlerExceptionResolver)} + * either directly or extend {@link RepositoryRestConfigurerAdapter} and override the method. */ + @Deprecated protected void configureExceptionHandlerExceptionResolver(ExceptionHandlerExceptionResolver exceptionResolver) {} /** * Configure the available {@link HttpMessageConverter}s by adding your own. * * @param messageConverters The converters to be used by the system. + * @deprecated since 2.4, implement {@link RepositoryRestConfigurer#configureHttpMessageConverters(List)} either + * directly or extend {@link RepositoryRestConfigurerAdapter} and override the method. */ + @Deprecated protected void configureHttpMessageConverters(List> messageConverters) {} /** * Configure the Jackson {@link ObjectMapper} directly. * * @param objectMapper The {@literal ObjectMapper} to be used by the system. + * @deprecated since 2.4, implement {@link RepositoryRestConfigurer#configureJacksonObjectMapper(ObjectMapper)} either + * directly or extend {@link RepositoryRestConfigurerAdapter} and override the method. */ + @Deprecated protected void configureJacksonObjectMapper(ObjectMapper objectMapper) {} } diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/LegacyRepresentationConfigIntegrationTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/LegacyRepresentationConfigIntegrationTests.java index ab3ecd95f..edc515ab6 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/LegacyRepresentationConfigIntegrationTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/config/LegacyRepresentationConfigIntegrationTests.java @@ -38,11 +38,11 @@ import org.springframework.test.context.ContextConfiguration; public class LegacyRepresentationConfigIntegrationTests extends AbstractRepositoryRestMvcConfigurationIntegrationTests { @Configuration - @Import(MongoDbRepositoryConfig.class) - static class Config extends RepositoryRestMvcConfiguration { + @Import({ MongoDbRepositoryConfig.class, RepositoryRestMvcConfiguration.class }) + static class Config extends RepositoryRestConfigurerAdapter { @Override - protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { + public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.setDefaultMediaType(MediaType.APPLICATION_JSON); config.useHalAsDefaultJsonMediaType(false); } 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 7bc9834c2..26cedf0c4 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright 2013-2014 the original author or authors. + * Copyright 2013-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.PageRequest; @@ -207,7 +208,8 @@ public class RepositoryRestMvConfigurationIntegrationTests { } @Configuration - static class ExtendingConfiguration extends RepositoryRestMvcConfiguration { + @Import(RepositoryRestMvcConfiguration.class) + static class ExtendingConfiguration extends RepositoryRestConfigurerAdapter { @Bean public DefaultRelProvider relProvider() { @@ -220,7 +222,7 @@ public class RepositoryRestMvConfigurationIntegrationTests { } @Override - protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { + public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.setDefaultPageSize(45); config.setMaxPageSize(7000); @@ -231,7 +233,8 @@ public class RepositoryRestMvConfigurationIntegrationTests { } @Configuration - static class NonHalConfiguration extends RepositoryRestMvcConfiguration { + @Import(RepositoryRestMvcConfiguration.class) + static class NonHalConfiguration extends RepositoryRestConfigurerAdapter { @Bean public CollectingComponent collectingComponent() { @@ -239,7 +242,7 @@ public class RepositoryRestMvConfigurationIntegrationTests { } @Override - protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { + public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.useHalAsDefaultJsonMediaType(false); } } diff --git a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/PersistentEntityToJsonSchemaConverterUnitTests.java b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/PersistentEntityToJsonSchemaConverterUnitTests.java index 40ae8c548..7d0062c73 100644 --- a/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/PersistentEntityToJsonSchemaConverterUnitTests.java +++ b/spring-data-rest-webmvc/src/test/java/org/springframework/data/rest/webmvc/json/PersistentEntityToJsonSchemaConverterUnitTests.java @@ -28,12 +28,14 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; import org.springframework.context.support.MessageSourceAccessor; import org.springframework.data.mapping.context.PersistentEntities; import org.springframework.data.rest.core.config.JsonSchemaFormat; import org.springframework.data.rest.core.config.RepositoryRestConfiguration; import org.springframework.data.rest.core.mapping.RepositoryResourceMappings; import org.springframework.data.rest.webmvc.TestMvcClient; +import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurerAdapter; import org.springframework.data.rest.webmvc.config.RepositoryRestMvcConfiguration; import org.springframework.data.rest.webmvc.json.PersistentEntityToJsonSchemaConverterUnitTests.TestConfiguration; import org.springframework.data.rest.webmvc.mongodb.MongoDbRepositoryConfig; @@ -62,10 +64,11 @@ public class PersistentEntityToJsonSchemaConverterUnitTests { @Autowired @Qualifier("objectMapper") ObjectMapper objectMapper; @Configuration - static class TestConfiguration extends RepositoryRestMvcConfiguration { + @Import(RepositoryRestMvcConfiguration.class) + static class TestConfiguration extends RepositoryRestConfigurerAdapter { @Override - protected void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { + public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) { config.metadataConfiguration().registerJsonSchemaFormat(JsonSchemaFormat.EMAIL, EmailAddress.class); config.metadataConfiguration().registerFormattingPatternFor("[A-Z]+", TypeWithPattern.class); } @@ -87,8 +90,8 @@ public class PersistentEntityToJsonSchemaConverterUnitTests { List constraints = new ArrayList(); constraints.add(new Constraint("$.description", is("Profile description"), "Adds description to schema root")); constraints.add(new Constraint("$.properties.renamed", is(notNullValue()), "Has descriptor for renamed property")); - constraints.add(new Constraint("$.properties.aliased", is(nullValue()), - "No descriptor for original name of renamed property")); + constraints.add( + new Constraint("$.properties.aliased", is(nullValue()), "No descriptor for original name of renamed property")); assertConstraints(Profile.class, constraints); } @@ -98,29 +101,29 @@ public class PersistentEntityToJsonSchemaConverterUnitTests { List constraints = new ArrayList(); constraints.add(new Constraint("$.properties.firstname.type", is("string"), "Exposes firstname as String")); - constraints.add(new Constraint("$.descriptors.address", is(notNullValue()), - "Exposes nested objects as descriptors.")); + constraints + .add(new Constraint("$.descriptors.address", is(notNullValue()), "Exposes nested objects as descriptors.")); constraints.add(new Constraint("$.descriptors.address.type", is("object"), "Nested entity is of type 'object'")); - constraints.add(new Constraint("$.descriptors.address.properties.zipCode", is(notNullValue()), - "Exposes nested properties")); - constraints.add(new Constraint("$.descriptors.address.requiredProperties[0]", is("zipCode"), - "Lists nested required property")); + constraints.add( + new Constraint("$.descriptors.address.properties.zipCode", is(notNullValue()), "Exposes nested properties")); + constraints.add( + new Constraint("$.descriptors.address.requiredProperties[0]", is("zipCode"), "Lists nested required property")); constraints.add(new Constraint("$.properties.gender.type", is("string"), "Enums are strings.")); constraints.add(new Constraint("$.properties.gender.enum", is(notNullValue()), "Exposes enum values.")); - constraints.add(new Constraint("$.properties.jodaDateTime.format", is("date-time"), - "Exposes JodaTime dates in format.")); - constraints.add(new Constraint("$.properties.java8DateTime.format", is("date-time"), - "Exposes Java 8 dates in format.")); + constraints + .add(new Constraint("$.properties.jodaDateTime.format", is("date-time"), "Exposes JodaTime dates in format.")); + constraints + .add(new Constraint("$.properties.java8DateTime.format", is("date-time"), "Exposes Java 8 dates in format.")); constraints.add(new Constraint("$.properties.nicknames.type", is("array"), "Exposes collection of simple types.")); constraints.add(new Constraint("$.properties.nicknames.items.type", is("string"), "Exposes element type of collection of simple types.")); constraints.add(new Constraint("$.properties.email.format", is("email"), "Uses manually configured format.")); constraints.add(new Constraint("$.properties.email.type", is("string"), "Treats types with format as String.")); - constraints.add(new Constraint("$.properties.shippingAddresses.type", is("array"), - "Exposes collection of complex types.")); - constraints.add(new Constraint("$.properties.shippingAddresses.uniqueItems", is(true), - "Exposes uniqueness for Sets.")); + constraints.add( + new Constraint("$.properties.shippingAddresses.type", is("array"), "Exposes collection of complex types.")); + constraints + .add(new Constraint("$.properties.shippingAddresses.uniqueItems", is(true), "Exposes uniqueness for Sets.")); constraints.add(new Constraint("$.properties.shippingAddresses.items['$ref']", is("#/descriptors/address"), "References descriptor of complex element type."));