diff --git a/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonMediaTypeConfiguration.java b/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonMediaTypeConfiguration.java index f0f9aa02..74225268 100644 --- a/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonMediaTypeConfiguration.java +++ b/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonMediaTypeConfiguration.java @@ -36,7 +36,7 @@ import com.fasterxml.jackson.databind.Module; class CollectionJsonMediaTypeConfiguration implements HypermediaMappingInformation { @Bean - LinkDiscoverer linkDiscoverer() { + LinkDiscoverer collectionJsonLinkDiscoverer() { return new CollectionJsonLinkDiscoverer(); } diff --git a/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonConfigurationProvider.java b/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonMediaTypeConfigurationProvider.java similarity index 88% rename from src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonConfigurationProvider.java rename to src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonMediaTypeConfigurationProvider.java index 6475576c..66c14cd0 100644 --- a/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonConfigurationProvider.java +++ b/src/main/java/org/springframework/hateoas/collectionjson/CollectionJsonMediaTypeConfigurationProvider.java @@ -23,9 +23,11 @@ import org.springframework.hateoas.config.MediaTypeConfigurationProvider; import org.springframework.http.MediaType; /** - * @author Oliver Gierke + * {@link MediaTypeConfigurationProvider} for Collection/JSON. + * + * @author Oliver Drotbohm */ -class CollectionJsonConfigurationProvider implements MediaTypeConfigurationProvider { +class CollectionJsonMediaTypeConfigurationProvider implements MediaTypeConfigurationProvider { /* * (non-Javadoc) diff --git a/src/main/java/org/springframework/hateoas/config/reactive/WebFluxHateoasConfiguration.java b/src/main/java/org/springframework/hateoas/config/reactive/WebFluxHateoasConfiguration.java index d93f0670..54929a02 100644 --- a/src/main/java/org/springframework/hateoas/config/reactive/WebFluxHateoasConfiguration.java +++ b/src/main/java/org/springframework/hateoas/config/reactive/WebFluxHateoasConfiguration.java @@ -131,6 +131,7 @@ class WebFluxHateoasConfiguration { MimeType[] mimeTypes = hypermedia.getMediaTypes().toArray(new MimeType[0]); ObjectMapper objectMapper = hypermedia.configureObjectMapper(this.mapper.copy()); + customCodecs.encoder(new Jackson2JsonEncoder(objectMapper, mimeTypes)); customCodecs.decoder(new Jackson2JsonDecoder(objectMapper, mimeTypes)); }); diff --git a/src/main/java/org/springframework/hateoas/hal/HalMediaTypeConfiguration.java b/src/main/java/org/springframework/hateoas/hal/HalMediaTypeConfiguration.java index ee36f9f3..917eb760 100644 --- a/src/main/java/org/springframework/hateoas/hal/HalMediaTypeConfiguration.java +++ b/src/main/java/org/springframework/hateoas/hal/HalMediaTypeConfiguration.java @@ -48,7 +48,7 @@ public class HalMediaTypeConfiguration implements HypermediaMappingInformation { private final MessageSourceAccessor messageSourceAccessor; @Bean - LinkDiscoverer linkDiscoverer() { + LinkDiscoverer halLinkDisocoverer() { return new HalLinkDiscoverer(); } diff --git a/src/main/java/org/springframework/hateoas/hal/HalConfigurationProvider.java b/src/main/java/org/springframework/hateoas/hal/HalMediaTypeConfigurationProvider.java similarity index 94% rename from src/main/java/org/springframework/hateoas/hal/HalConfigurationProvider.java rename to src/main/java/org/springframework/hateoas/hal/HalMediaTypeConfigurationProvider.java index be3ca1ee..16e982d3 100644 --- a/src/main/java/org/springframework/hateoas/hal/HalConfigurationProvider.java +++ b/src/main/java/org/springframework/hateoas/hal/HalMediaTypeConfigurationProvider.java @@ -27,7 +27,7 @@ import org.springframework.http.MediaType; * * @author Oliver Drotbohm */ -class HalConfigurationProvider implements MediaTypeConfigurationProvider { +class HalMediaTypeConfigurationProvider implements MediaTypeConfigurationProvider { /* * (non-Javadoc) diff --git a/src/main/java/org/springframework/hateoas/hal/forms/HalFormsMediaTypeConfiguration.java b/src/main/java/org/springframework/hateoas/hal/forms/HalFormsMediaTypeConfiguration.java index 1f2d7f6d..97ba53b4 100644 --- a/src/main/java/org/springframework/hateoas/hal/forms/HalFormsMediaTypeConfiguration.java +++ b/src/main/java/org/springframework/hateoas/hal/forms/HalFormsMediaTypeConfiguration.java @@ -49,7 +49,7 @@ class HalFormsMediaTypeConfiguration implements HypermediaMappingInformation { private final MessageSourceAccessor messageSourceAccessor; @Bean - LinkDiscoverer linkDiscoverer() { + LinkDiscoverer halFormsLinkDiscoverer() { return new HalFormsLinkDiscoverer(); } @@ -69,15 +69,13 @@ class HalFormsMediaTypeConfiguration implements HypermediaMappingInformation { @Override public ObjectMapper configureObjectMapper(ObjectMapper mapper) { - ObjectMapper mapper1 = mapper.copy(); - - mapper1.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - mapper1.registerModule(new Jackson2HalFormsModule()); - mapper1.setHandlerInstantiator( + mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); + mapper.registerModule(new Jackson2HalFormsModule()); + mapper.setHandlerInstantiator( new Jackson2HalFormsModule.HalFormsHandlerInstantiator(relProvider, curieProvider.getIfAvailable(), messageSourceAccessor, true, halFormsConfiguration.getIfAvailable(HalFormsConfiguration::new))); - return mapper1; + return mapper; } } diff --git a/src/main/java/org/springframework/hateoas/hal/forms/HalFormsConfigurationProvider.java b/src/main/java/org/springframework/hateoas/hal/forms/HalFormsMediaTypeConfigurationProvider.java similarity index 94% rename from src/main/java/org/springframework/hateoas/hal/forms/HalFormsConfigurationProvider.java rename to src/main/java/org/springframework/hateoas/hal/forms/HalFormsMediaTypeConfigurationProvider.java index 1afafacf..39f112f3 100644 --- a/src/main/java/org/springframework/hateoas/hal/forms/HalFormsConfigurationProvider.java +++ b/src/main/java/org/springframework/hateoas/hal/forms/HalFormsMediaTypeConfigurationProvider.java @@ -27,7 +27,7 @@ import org.springframework.http.MediaType; * * @author Oliver Drotbohm */ -class HalFormsConfigurationProvider implements MediaTypeConfigurationProvider { +class HalFormsMediaTypeConfigurationProvider implements MediaTypeConfigurationProvider { /* * (non-Javadoc) diff --git a/src/main/java/org/springframework/hateoas/uber/UberMediaTypeConfiguration.java b/src/main/java/org/springframework/hateoas/uber/UberMediaTypeConfiguration.java index c1820981..45d65ecd 100644 --- a/src/main/java/org/springframework/hateoas/uber/UberMediaTypeConfiguration.java +++ b/src/main/java/org/springframework/hateoas/uber/UberMediaTypeConfiguration.java @@ -36,7 +36,7 @@ import com.fasterxml.jackson.databind.Module; class UberMediaTypeConfiguration implements HypermediaMappingInformation { @Bean - LinkDiscoverer linkDiscoverer() { + LinkDiscoverer uberLinkDiscoverer() { return new UberLinkDiscoverer(); } diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories index 57b9750c..b876c698 100644 --- a/src/main/resources/META-INF/spring.factories +++ b/src/main/resources/META-INF/spring.factories @@ -1,7 +1,10 @@ -org.springframework.hateoas.AffordanceModelFactory=org.springframework.hateoas.hal.forms.HalFormsAffordanceModelFactory,org.springframework.hateoas.collectionjson.CollectionJsonAffordanceModelFactory,org.springframework.hateoas.uber.UberAffordanceModelFactory +org.springframework.hateoas.AffordanceModelFactory=\ + org.springframework.hateoas.hal.forms.HalFormsAffordanceModelFactory,\ + org.springframework.hateoas.collectionjson.CollectionJsonAffordanceModelFactory,\ + org.springframework.hateoas.uber.UberAffordanceModelFactory org.springframework.hateoas.config.MediaTypeConfigurationProvider=\ -org.springframework.hateoas.collectionjson.CollectionJsonConfigurationProvider,\ -org.springframework.hateoas.hal.HalConfigurationProvider,\ -org.springframework.hateoas.hal.forms.HalFormsConfigurationProvider,\ -org.springframework.hateoas.uber.UberConfigurationProvider + org.springframework.hateoas.collectionjson.CollectionJsonMediaTypeConfigurationProvider,\ + org.springframework.hateoas.hal.HalMediaTypeConfigurationProvider,\ + org.springframework.hateoas.hal.forms.HalFormsMediaTypeConfigurationProvider,\ + org.springframework.hateoas.uber.UberMediaTypeConfigurationProvider diff --git a/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java b/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java index 7c20ef79..e8c055c3 100755 --- a/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/config/EnableHypermediaSupportIntegrationTest.java @@ -109,7 +109,7 @@ public class EnableHypermediaSupportIntegrationTest { }); } - @Test + @Test // #833 public void registersHalFormsLinkDiscoverers() { withServletContext(HalFormsConfig.class, context -> { @@ -123,6 +123,26 @@ public class EnableHypermediaSupportIntegrationTest { }); } + @Test // #833 + public void registersHalAndHalFormsLinkDiscoverers() { + + withServletContext(HalAndHalFormsConfig.class, context -> { + + LinkDiscoverers discoverers = context.getBean(LinkDiscoverers.class); + + assertThat(discoverers).isNotNull(); + assertThat(discoverers.getLinkDiscovererFor(MediaTypes.HAL_JSON)) + .hasValueSatisfying(HalLinkDiscoverer.class::isInstance); + assertThat(discoverers.getLinkDiscovererFor(MediaTypes.HAL_JSON_UTF8)) + .hasValueSatisfying(HalLinkDiscoverer.class::isInstance); + + assertThat(discoverers.getLinkDiscovererFor(MediaTypes.HAL_FORMS_JSON)) + .hasValueSatisfying(HalFormsLinkDiscoverer.class::isInstance); + + assertRelProvidersSetUp(context); + }); + } + @Test public void registersCollectionJsonLinkDiscoverers() { @@ -693,4 +713,9 @@ public class EnableHypermediaSupportIntegrationTest { static class DelegateUberHypermediaConfig { } + + @EnableHypermediaSupport(type = { HypermediaType.HAL, HypermediaType.HAL_FORMS }) + static class HalAndHalFormsConfig { + + } } diff --git a/src/test/java/org/springframework/hateoas/config/HypermediaConfigurationImportSelectorUnitTest.java b/src/test/java/org/springframework/hateoas/config/HypermediaConfigurationImportSelectorUnitTest.java new file mode 100644 index 00000000..9dc553ef --- /dev/null +++ b/src/test/java/org/springframework/hateoas/config/HypermediaConfigurationImportSelectorUnitTest.java @@ -0,0 +1,111 @@ +/* + * Copyright 2019 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.hateoas.config; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.*; +import static org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType.*; +import static org.springframework.hateoas.support.ContextTester.*; + +import java.util.Map; + +import org.junit.Test; +import org.springframework.hateoas.LinkDiscoverer; +import org.springframework.hateoas.collectionjson.CollectionJsonLinkDiscoverer; +import org.springframework.hateoas.hal.HalLinkDiscoverer; +import org.springframework.hateoas.hal.forms.HalFormsLinkDiscoverer; +import org.springframework.hateoas.uber.UberLinkDiscoverer; + +/** + * Unit tests for {@link HypermediaConfigurationImportSelector}. + * + * @author Greg Turnquist + */ +public class HypermediaConfigurationImportSelectorUnitTest { + + @Test // #833 + public void testHalImportConfiguration() { + + withContext(HalConfig.class, context -> { + + Map linkDiscoverers = context.getBeansOfType(LinkDiscoverer.class); + + assertThat(linkDiscoverers.values()).extracting("class") // + .containsExactly(HalLinkDiscoverer.class); + }); + } + + @Test // #833 + public void testHalFormsImportConfiguration() { + + withContext(HalFormsConfig.class, context -> { + + Map linkDiscoverers = context.getBeansOfType(LinkDiscoverer.class); + + assertThat(linkDiscoverers.values()).extracting("class") // + .containsExactly(HalFormsLinkDiscoverer.class); + }); + } + + @Test // #833 + public void testHalAndHalFormsImportConfigurations() { + + withContext(HalAndHalFormsConfig.class, context -> { + + Map linkDiscoverers = context.getBeansOfType(LinkDiscoverer.class); + + assertThat(linkDiscoverers.values()).extracting("class") // + .containsExactlyInAnyOrder( // + HalLinkDiscoverer.class, // + HalFormsLinkDiscoverer.class); + }); + } + + @Test // #833 + public void testAllImportConfigurations() { + + withContext(AllConfig.class, context -> { + + Map linkDiscoverers = context.getBeansOfType(LinkDiscoverer.class); + + assertThat(linkDiscoverers.values()).extracting("class") // + .containsExactlyInAnyOrder( // + HalLinkDiscoverer.class, // + HalFormsLinkDiscoverer.class, // + UberLinkDiscoverer.class, // + CollectionJsonLinkDiscoverer.class); + }); + } + + @EnableHypermediaSupport(type = HAL) + static class HalConfig { + + } + + @EnableHypermediaSupport(type = HAL_FORMS) + static class HalFormsConfig { + + } + + @EnableHypermediaSupport(type = { HAL, HAL_FORMS }) + static class HalAndHalFormsConfig { + + } + + @EnableHypermediaSupport(type = { HAL, HAL_FORMS, UBER, COLLECTION_JSON }) + static class AllConfig { + + } +}