diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfiguration.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfiguration.java index 966b834c..e20d1f43 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfiguration.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2020 the original author or authors. + * Copyright 2016-2021 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. @@ -16,76 +16,48 @@ package org.springframework.cloud.openfeign.hateoas; -import java.util.Arrays; import java.util.Collections; -import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.boot.autoconfigure.AutoConfigureAfter; -import org.springframework.boot.autoconfigure.AutoConfigureBefore; +import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; import org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration; -import org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration; import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.hateoas.RepresentationModel; -import org.springframework.hateoas.mediatype.MessageResolver; -import org.springframework.hateoas.mediatype.hal.CurieProvider; -import org.springframework.hateoas.mediatype.hal.DefaultCurieProvider; -import org.springframework.hateoas.mediatype.hal.HalConfiguration; -import org.springframework.hateoas.mediatype.hal.Jackson2HalModule; -import org.springframework.hateoas.server.LinkRelationProvider; +import org.springframework.hateoas.mediatype.hal.HalMediaTypeConfiguration; import org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter; import static org.springframework.hateoas.MediaTypes.HAL_JSON; /** * @author Hector Espert + * @author Olga Maciaszek-Sharma */ @Configuration(proxyBeanMethods = false) @ConditionalOnWebApplication @ConditionalOnClass(RepresentationModel.class) @AutoConfigureAfter({ JacksonAutoConfiguration.class, HttpMessageConvertersAutoConfiguration.class, RepositoryRestMvcAutoConfiguration.class }) -@AutoConfigureBefore(HypermediaAutoConfiguration.class) public class FeignHalAutoConfiguration { @Bean + @ConditionalOnBean(HalMediaTypeConfiguration.class) @ConditionalOnMissingBean public TypeConstrainedMappingJackson2HttpMessageConverter halJacksonHttpMessageConverter( - ObjectProvider objectMapper, ObjectProvider halConfiguration, - ObjectProvider messageResolver, ObjectProvider curieProvider, - ObjectProvider linkRelationProvider) { - + ObjectProvider objectMapper, HalMediaTypeConfiguration halConfiguration) { ObjectMapper mapper = objectMapper.getIfAvailable(ObjectMapper::new).copy(); - mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); - - HalConfiguration configuration = halConfiguration.getIfAvailable(HalConfiguration::new); - - CurieProvider curieProviderInstance = curieProvider - .getIfAvailable(() -> new DefaultCurieProvider(Collections.emptyMap())); - - Jackson2HalModule.HalHandlerInstantiator halHandlerInstantiator = new Jackson2HalModule.HalHandlerInstantiator( - linkRelationProvider.getIfAvailable(), curieProviderInstance, messageResolver.getIfAvailable(), - configuration, new DefaultListableBeanFactory()); - - mapper.setHandlerInstantiator(halHandlerInstantiator); - - if (!Jackson2HalModule.isAlreadyRegisteredIn(mapper)) { - Jackson2HalModule halModule = new Jackson2HalModule(); - mapper.registerModule(halModule); - } - + halConfiguration.configureObjectMapper(mapper); TypeConstrainedMappingJackson2HttpMessageConverter converter = new TypeConstrainedMappingJackson2HttpMessageConverter( RepresentationModel.class); - converter.setSupportedMediaTypes(Arrays.asList(HAL_JSON)); + converter.setSupportedMediaTypes(Collections.singletonList(HAL_JSON)); converter.setObjectMapper(mapper); return converter; } diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfigurationTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfigurationTests.java index 7c0c8923..b2757760 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfigurationTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/hateoas/FeignHalAutoConfigurationTests.java @@ -16,7 +16,7 @@ package org.springframework.cloud.openfeign.hateoas; -import java.util.Arrays; +import java.util.Collections; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; @@ -26,9 +26,11 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.hateoas.mediatype.MessageResolver; import org.springframework.hateoas.mediatype.hal.CurieProvider; import org.springframework.hateoas.mediatype.hal.HalConfiguration; +import org.springframework.hateoas.mediatype.hal.HalMediaTypeConfiguration; import org.springframework.hateoas.mediatype.hal.Jackson2HalModule; import org.springframework.hateoas.server.LinkRelationProvider; import org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter; @@ -41,24 +43,25 @@ import static org.springframework.hateoas.MediaTypes.HAL_JSON; /** * @author Hector Espert + * @author Olga Maciaszek-Sharma */ @RunWith(MockitoJUnitRunner.class) public class FeignHalAutoConfigurationTests { - @Mock - private ObjectProvider objectMapper; - @Mock private ObjectProvider halConfiguration; @Mock - private ObjectProvider relProvider; + private ObjectProvider objectMapper; + + @Mock + private LinkRelationProvider relProvider; @Mock private ObjectProvider curieProvider; @Mock - private ObjectProvider messageResolver; + private MessageResolver messageResolver; @InjectMocks private FeignHalAutoConfiguration feignHalAutoConfiguration; @@ -69,17 +72,17 @@ public class FeignHalAutoConfigurationTests { when(objectMapper.getIfAvailable(any())).thenReturn(mapper); when(halConfiguration.getIfAvailable(any())).thenReturn(mock(HalConfiguration.class)); - when(relProvider.getIfAvailable()).thenReturn(mock(LinkRelationProvider.class)); when(curieProvider.getIfAvailable(any())).thenReturn(mock(CurieProvider.class)); - when(messageResolver.getIfAvailable()).thenReturn(mock(MessageResolver.class)); + + HalMediaTypeConfiguration halMediaTypeConfiguration = new HalMediaTypeConfiguration(relProvider, curieProvider, + halConfiguration, messageResolver, new DefaultListableBeanFactory()); TypeConstrainedMappingJackson2HttpMessageConverter converter = feignHalAutoConfiguration - .halJacksonHttpMessageConverter(objectMapper, halConfiguration, messageResolver, curieProvider, - relProvider); + .halJacksonHttpMessageConverter(objectMapper, halMediaTypeConfiguration); assertThat(converter).isNotNull(); assertThat(converter.getObjectMapper()).isNotNull(); - assertThat(converter.getSupportedMediaTypes()).isEqualTo(Arrays.asList(HAL_JSON)); + assertThat(converter.getSupportedMediaTypes()).isEqualTo(Collections.singletonList(HAL_JSON)); assertThat(Jackson2HalModule.isAlreadyRegisteredIn(converter.getObjectMapper())).isTrue(); }