diff --git a/src/main/java/org/springframework/hateoas/config/DefaultHateoasConfigurer.java b/src/main/java/org/springframework/hateoas/config/DefaultHateoasConfigurer.java new file mode 100644 index 000000000..5d6da8217 --- /dev/null +++ b/src/main/java/org/springframework/hateoas/config/DefaultHateoasConfigurer.java @@ -0,0 +1,21 @@ +package org.springframework.hateoas.config; + +import org.springframework.hateoas.MediaTypes; +import org.springframework.http.MediaType; + +import java.util.Arrays; +import java.util.List; + +/** + * Default implementation of {@link HateoasConfigurer}. + * + * @author Alexander Morozov + */ +public class DefaultHateoasConfigurer implements HateoasConfigurer { + + @Override + public List getSupportedMediaTypes() { + return Arrays.asList(MediaTypes.HAL_JSON); + } + +} diff --git a/src/main/java/org/springframework/hateoas/config/HateoasConfigurer.java b/src/main/java/org/springframework/hateoas/config/HateoasConfigurer.java new file mode 100644 index 000000000..ecc11b705 --- /dev/null +++ b/src/main/java/org/springframework/hateoas/config/HateoasConfigurer.java @@ -0,0 +1,20 @@ +package org.springframework.hateoas.config; + +import org.springframework.http.MediaType; + +import java.util.List; + +/** + * Configures HATEOAS environment. + * + * @author Alexander Morozov + * @see DefaultHateoasConfigurer + */ +public interface HateoasConfigurer { + + /** + * @return list of supported {@link MediaType} + */ + public List getSupportedMediaTypes(); + +} diff --git a/src/main/java/org/springframework/hateoas/config/HateoasConfigurerResolver.java b/src/main/java/org/springframework/hateoas/config/HateoasConfigurerResolver.java new file mode 100644 index 000000000..7ecf4f45b --- /dev/null +++ b/src/main/java/org/springframework/hateoas/config/HateoasConfigurerResolver.java @@ -0,0 +1,30 @@ +package org.springframework.hateoas.config; + +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.util.Assert; + +/** + * @author Alexander Morozov + */ +final class HateoasConfigurerResolver { + + private HateoasConfigurerResolver() { + // empty + } + + public static HateoasConfigurer resolveHateoasConfigurer(BeanFactory beanFactory) { + Assert.notNull(beanFactory, "Bean factory is required."); + HateoasConfigurer configurer = null; + try { + configurer = beanFactory.getBean(HateoasConfigurer.class); + } catch (NoSuchBeanDefinitionException ex) { + // nop + } + if (configurer == null) { + configurer = new DefaultHateoasConfigurer(); + } + return configurer; + } + +} diff --git a/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java b/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java index c1bf6e44f..52f8fb367 100644 --- a/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java +++ b/src/main/java/org/springframework/hateoas/config/HypermediaSupportBeanDefinitionRegistrar.java @@ -17,7 +17,6 @@ import static org.springframework.beans.factory.support.BeanDefinitionBuilder.*; import static org.springframework.beans.factory.support.BeanDefinitionReaderUtils.*; -import static org.springframework.hateoas.MediaTypes.*; import java.util.ArrayList; import java.util.Arrays; @@ -297,9 +296,10 @@ private List> potentiallyRegisterModule(List> result = new ArrayList>(converters.size()); diff --git a/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java b/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java index 4ac60d3aa..657aaed83 100644 --- a/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java @@ -19,6 +19,7 @@ import static org.junit.Assert.*; import java.lang.reflect.Method; +import java.util.Arrays; import java.util.List; import java.util.Map; @@ -42,6 +43,7 @@ import org.springframework.hateoas.core.DelegatingRelProvider; import org.springframework.hateoas.hal.HalLinkDiscoverer; import org.springframework.hateoas.mvc.TypeConstrainedMappingJackson2HttpMessageConverter; +import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.test.util.ReflectionTestUtils; @@ -133,6 +135,21 @@ public void registersHttpMessageConvertersForRestTemplate() { context.close(); } + /** + * @see #263 + */ + @Test + public void registerCustomMediaType() { + + AnnotationConfigApplicationContext context = + new AnnotationConfigApplicationContext(CustomMediaTypeConfig.class); + RestTemplate template = context.getBean(RestTemplate.class); + + assertThat(template.getMessageConverters().get(0).getSupportedMediaTypes(), + hasItem(CustomMediaTypeConfig.CUSTOM_TYPE)); + context.close(); + } + /** * @see #341 */ @@ -219,6 +236,26 @@ static class ExtendedHalConfig extends HalConfig { } + @Configuration + static class CustomMediaTypeConfig extends HalConfig { + + public static final MediaType CUSTOM_TYPE = MediaType.parseMediaType("application/vnd.vendor.resource+json"); + + @Bean + public HateoasConfigurer hateoasConfigurer() + { + return new HateoasConfigurer() { + + @Override + public List getSupportedMediaTypes() { + return Arrays.asList(CUSTOM_TYPE); + } + + }; + } + + } + @Configuration @EnableHypermediaSupport(type = HypermediaType.HAL) static class DelegateConfig {