#1223 - Provide API to configure RestTemplate with hypermedia.

Create a HypermediaRestTemplateConfigurer bean registered as a Spring HATEOAS bean.

Update reference documentation to show how to use it directly and with Spring Boot via RestTemplateCustomizer.
This commit is contained in:
Greg Turnquist
2020-03-23 16:50:44 -05:00
parent 4e697b899b
commit dea0001da2
6 changed files with 218 additions and 15 deletions

View File

@@ -0,0 +1,81 @@
package org.springframework.hateoas.config;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.Bean;
import org.springframework.hateoas.MediaTypes;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.util.Collections;
import static org.assertj.core.api.Assertions.*;
import static org.springframework.hateoas.config.EnableHypermediaSupport.HypermediaType.*;
import static org.springframework.hateoas.support.ContextTester.*;
public class HypermediaRestTemplateConfigurerTest {
private static MediaType FRODO_JSON = MediaType.parseMediaType("application/frodo+json");
@Test // #1223
void webConvertersShouldAddHypermediaMessageConverters() {
withContext(HalConfig.class, context -> {
HypermediaRestTemplateConfigurer configurer = context.getBean(HypermediaRestTemplateConfigurer.class);
RestTemplate restTemplate = configurer.registerHypermediaTypes(new RestTemplate());
assertThat(restTemplate.getMessageConverters()).flatExtracting(HttpMessageConverter::getSupportedMediaTypes)
.contains(MediaTypes.HAL_JSON) //
.doesNotContain(MediaTypes.HAL_FORMS_JSON, MediaTypes.COLLECTION_JSON, MediaTypes.UBER_JSON);
});
}
@Test // #1223
void webConvertersShouldAddAllHypermediaMessageConverters() {
withContext(AllHypermediaConfig.class, context -> {
HypermediaRestTemplateConfigurer configurer = context.getBean(HypermediaRestTemplateConfigurer.class);
RestTemplate restTemplate = configurer.registerHypermediaTypes(new RestTemplate());
assertThat(restTemplate.getMessageConverters()).flatExtracting(HttpMessageConverter::getSupportedMediaTypes)
.contains(MediaTypes.HAL_JSON, MediaTypes.HAL_FORMS_JSON, MediaTypes.COLLECTION_JSON, MediaTypes.UBER_JSON);
});
}
@Test // #1223
void webConvertersShouldSupportCustomHypermediaTypes() {
withContext(CustomHypermediaConfig.class, context -> {
HypermediaRestTemplateConfigurer configurer = context.getBean(HypermediaRestTemplateConfigurer.class);
RestTemplate restTemplate = configurer.registerHypermediaTypes(new RestTemplate());
assertThat(restTemplate.getMessageConverters()).flatExtracting(HttpMessageConverter::getSupportedMediaTypes)
.contains(MediaTypes.HAL_JSON, FRODO_JSON)
.doesNotContain(MediaTypes.HAL_FORMS_JSON, MediaTypes.COLLECTION_JSON, MediaTypes.UBER_JSON);
});
}
@EnableHypermediaSupport(type = HAL)
static class HalConfig {
}
@EnableHypermediaSupport(type = { HAL, HAL_FORMS, COLLECTION_JSON, UBER })
static class AllHypermediaConfig {
}
static class CustomHypermediaConfig extends HalConfig {
@Bean
HypermediaMappingInformation hypermediaMappingInformation() {
return () -> Collections.singletonList(FRODO_JSON);
}
}
}