#987 - Drop UTF8 HAL media type.

This commit is contained in:
Greg Turnquist
2019-05-30 15:49:56 -05:00
parent 400a6bb703
commit feaa56a68c
12 changed files with 43 additions and 70 deletions

View File

@@ -37,16 +37,6 @@ public class MediaTypes {
*/
public static final MediaType HAL_JSON = MediaType.valueOf(HAL_JSON_VALUE);
/**
* A String equivalent of {@link MediaTypes#HAL_JSON_UTF8}.
*/
public static final String HAL_JSON_UTF8_VALUE = HAL_JSON_VALUE + ";charset=UTF-8";
/**
* Public constant media type for {@code application/hal+json;charset=UTF-8}.
*/
public static final MediaType HAL_JSON_UTF8 = MediaType.valueOf(HAL_JSON_UTF8_VALUE);
/**
* A String equivalent of {@link MediaTypes#ALPS_JSON}.
*/

View File

@@ -73,7 +73,7 @@ public @interface EnableHypermediaSupport {
* @see http://stateless.co/hal_specification.html
* @see https://tools.ietf.org/html/draft-kelly-json-hal-05
*/
HAL(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8),
HAL(MediaTypes.HAL_JSON),
/**
* HAL-FORMS - Independent, backward-compatible extension of the HAL designed to add runtime FORM support

View File

@@ -36,7 +36,7 @@ public class HalLinkDiscoverer extends JsonPathLinkDiscoverer {
* Constructor for {@link MediaTypes#HAL_JSON}.
*/
public HalLinkDiscoverer() {
this(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
this(MediaTypes.HAL_JSON);
}
protected HalLinkDiscoverer(MediaType... mediaTypes) {

View File

@@ -17,7 +17,6 @@ package org.springframework.hateoas.mediatype.hal;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -41,7 +40,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
*/
class HalTraversonDefaults implements TraversonDefaults {
private static final List<MediaType> HAL_FLAVORS = Arrays.asList(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
private static final List<MediaType> HAL_FLAVORS = Collections.singletonList(MediaTypes.HAL_JSON);
/*
* (non-Javadoc)
@@ -54,7 +53,7 @@ class HalTraversonDefaults implements TraversonDefaults {
converters.add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
List<MediaType> halFlavors = mediaTypes.stream() //
.filter(it -> HAL_FLAVORS.contains(it)) //
.filter(HAL_FLAVORS::contains) //
.collect(Collectors.toList());
if (!halFlavors.isEmpty()) {

View File

@@ -76,7 +76,7 @@ class TraversonTest {
@BeforeEach
void setUp() {
this.traverson = new Traverson(baseUri, MediaTypes.HAL_JSON_UTF8, MediaTypes.HAL_JSON);
this.traverson = new Traverson(baseUri, MediaTypes.HAL_JSON);
}
@@ -120,7 +120,7 @@ class TraversonTest {
verifyThatRequest() //
.havingPathEqualTo("/") //
.havingHeader("Accept", contains(MediaTypes.HAL_JSON_UTF8_VALUE + ", " + MediaTypes.HAL_JSON_VALUE)); //
.havingHeader("Accept", contains(MediaTypes.HAL_JSON_VALUE)); //
}
/**
@@ -284,7 +284,7 @@ class TraversonTest {
assertThat(converters.get(0)).isInstanceOf(StringHttpMessageConverter.class);
assertThat(converters.get(1)).isInstanceOf(MappingJackson2HttpMessageConverter.class);
converters = Traverson.getDefaultMessageConverters(MediaTypes.HAL_JSON_UTF8);
converters = Traverson.getDefaultMessageConverters(MediaTypes.HAL_JSON);
assertThat(converters).hasSize(2);
assertThat(converters.get(0)).isInstanceOf(StringHttpMessageConverter.class);
@@ -424,19 +424,19 @@ class TraversonTest {
verifyThatRequest() //
.havingPathEqualTo("/") //
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_UTF8_VALUE + ", " + MediaTypes.HAL_JSON_VALUE)); //
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_VALUE)); //
verifyThatRequest().havingPathEqualTo("/movies") // aggregate root movies
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_UTF8_VALUE + ", " + MediaTypes.HAL_JSON_VALUE)) //
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_VALUE)) //
.havingHeader(customHeaderName, contains("alpha")) //
.havingHeader(HttpHeaders.LOCATION, contains("http://localhost:8080/my/custom/location")); //
verifyThatRequest().havingPath(startsWith("/movies/")) // single movie
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_UTF8_VALUE + ", " + MediaTypes.HAL_JSON_VALUE)) //
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_VALUE)) //
.havingHeader(customHeaderName, contains("bravo")); //
verifyThatRequest().havingPath(startsWith("/actors/")) // single actor
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_UTF8_VALUE + ", " + MediaTypes.HAL_JSON_VALUE)) //
.havingHeader(HttpHeaders.ACCEPT, contains(MediaTypes.HAL_JSON_VALUE)) //
.havingHeader(customHeaderName, contains("charlie")); //
}

View File

@@ -110,8 +110,6 @@ class EnableHypermediaSupportIntegrationTest {
assertThat(discoverers).isNotNull();
assertThat(discoverers.getLinkDiscovererFor(MediaTypes.HAL_JSON))
.hasValueSatisfying(HalLinkDiscoverer.class::isInstance);
assertThat(discoverers.getLinkDiscovererFor(MediaTypes.HAL_JSON_UTF8))
.hasValueSatisfying(HalLinkDiscoverer.class::isInstance);
assertRelProvidersSetUp(context);
});
}
@@ -140,8 +138,6 @@ class EnableHypermediaSupportIntegrationTest {
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);
@@ -210,7 +206,7 @@ class EnableHypermediaSupportIntegrationTest {
RequestMappingHandlerAdapter adapter = context.getBean(RequestMappingHandlerAdapter.class);
assertThat(adapter.getMessageConverters().get(0).getSupportedMediaTypes()) //
.contains(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
.contains(MediaTypes.HAL_JSON);
boolean found = false;
@@ -225,7 +221,7 @@ class EnableHypermediaSupportIntegrationTest {
.getField(processor, "messageConverters");
assertThat(converters.get(0)).isInstanceOfSatisfying(TypeConstrainedMappingJackson2HttpMessageConverter.class,
it -> assertThat(it.getSupportedMediaTypes()).contains(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8));
it -> assertThat(it.getSupportedMediaTypes()).contains(MediaTypes.HAL_JSON));
}
}
@@ -343,7 +339,7 @@ class EnableHypermediaSupportIntegrationTest {
RestTemplate template = context.getBean(RestTemplate.class);
assertThat(template.getMessageConverters().get(0).getSupportedMediaTypes()) //
.contains(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
.contains(MediaTypes.HAL_JSON);
});
}

View File

@@ -52,7 +52,6 @@ class HypermediaRestTemplateBeanPostProcessorTest {
assertThat(lookupSupportedHypermediaTypes(context.getBean(RestTemplate.class))) //
.containsExactlyInAnyOrder( //
MediaTypes.HAL_JSON, //
MediaTypes.HAL_JSON_UTF8, //
MediaType.APPLICATION_JSON, //
MediaType.parseMediaType("application/*+json"));
});
@@ -69,7 +68,6 @@ class HypermediaRestTemplateBeanPostProcessorTest {
assertThat(lookupSupportedHypermediaTypes(context.getBean(RestTemplate.class))) //
.containsExactlyInAnyOrder( //
MediaTypes.HAL_JSON, //
MediaTypes.HAL_JSON_UTF8, //
MediaTypes.COLLECTION_JSON, //
MediaType.APPLICATION_JSON, //
MediaType.parseMediaType("application/*+json"));
@@ -87,7 +85,6 @@ class HypermediaRestTemplateBeanPostProcessorTest {
assertThat(lookupSupportedHypermediaTypes(context.getBean(RestTemplate.class))) //
.containsExactlyInAnyOrder( //
MediaTypes.HAL_JSON, //
MediaTypes.HAL_JSON_UTF8, //
MediaTypes.HAL_FORMS_JSON, //
MediaTypes.COLLECTION_JSON, //
MediaTypes.UBER_JSON, //
@@ -104,7 +101,6 @@ class HypermediaRestTemplateBeanPostProcessorTest {
assertThat(lookupSupportedHypermediaTypes(context.getBean(RestTemplate.class))) //
.containsExactlyInAnyOrder( //
MediaTypes.HAL_JSON, //
MediaTypes.HAL_JSON_UTF8, //
MediaType.parseMediaType("application/frodo+json"), //
MediaType.APPLICATION_JSON, //
MediaType.parseMediaType("application/*+json") //

View File

@@ -81,12 +81,12 @@ class HypermediaWebFluxConfigurerTest {
setUp(HalWebFluxConfig.class);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON);
}
/**
@@ -145,9 +145,9 @@ class HypermediaWebFluxConfigurerTest {
setUp(AllHalWebFluxConfig.class);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON);
verifyRootUriServesHypermedia(MediaTypes.HAL_FORMS_JSON);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_FORMS_JSON);
@@ -162,8 +162,8 @@ class HypermediaWebFluxConfigurerTest {
setUp(AllHalWebFluxConfig.class);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON);
verifyCreatingNewEntityWorks(MediaTypes.HAL_FORMS_JSON);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_FORMS_JSON);
@@ -177,9 +177,9 @@ class HypermediaWebFluxConfigurerTest {
setUp(HalAndCollectionJsonWebFluxConfig.class);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON);
verifyRootUriServesHypermedia(MediaTypes.HAL_FORMS_JSON);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_FORMS_JSON);
@@ -198,8 +198,8 @@ class HypermediaWebFluxConfigurerTest {
setUp(HalAndCollectionJsonWebFluxConfig.class);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON);
verifyCreatingNewEntityWorks(MediaTypes.HAL_FORMS_JSON);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_FORMS_JSON);
@@ -216,9 +216,9 @@ class HypermediaWebFluxConfigurerTest {
setUp(AllHypermediaTypesWebFluxConfig.class);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyRootUriServesHypermedia(MediaTypes.HAL_JSON);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_JSON);
verifySingleItemResourceServesHypermedia(MediaTypes.HAL_JSON);
verifyRootUriServesHypermedia(MediaTypes.HAL_FORMS_JSON);
verifyAggregateRootServesHypermedia(MediaTypes.HAL_FORMS_JSON);
@@ -241,8 +241,8 @@ class HypermediaWebFluxConfigurerTest {
setUp(AllHypermediaTypesWebFluxConfig.class);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON, MediaTypes.HAL_JSON_UTF8);
verifyCreatingNewEntityWorks(MediaTypes.HAL_JSON);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_JSON);
verifyCreatingNewEntityWorks(MediaTypes.HAL_FORMS_JSON);
verifyCreatingNewEntityReactivelyShouldWork(MediaTypes.HAL_FORMS_JSON);
@@ -276,7 +276,7 @@ class HypermediaWebFluxConfigurerTest {
this.testClient.get().uri("/reactive").accept(MediaTypes.HAL_JSON).exchange() //
.expectStatus().isOk() //
.expectHeader().contentType(MediaTypes.HAL_JSON_UTF8) //
.expectHeader().contentType(MediaTypes.HAL_JSON) //
.returnResult(RepresentationModel.class).getResponseBody().as(StepVerifier::create)
.expectNextMatches(resourceSupport -> {
@@ -287,7 +287,7 @@ class HypermediaWebFluxConfigurerTest {
}).verifyComplete();
this.testClient.get().uri("/reactive/employees").accept(MediaTypes.HAL_JSON).exchange() //
.expectStatus().isOk().expectHeader().contentType(MediaTypes.HAL_JSON_UTF8) //
.expectStatus().isOk().expectHeader().contentType(MediaTypes.HAL_JSON) //
.returnResult(this.resourcesEmployeeType).getResponseBody() //
.as(StepVerifier::create).expectNextMatches(resources -> {
@@ -304,7 +304,7 @@ class HypermediaWebFluxConfigurerTest {
}).verifyComplete();
this.testClient.get().uri("/reactive/employees/1").accept(MediaTypes.HAL_JSON).exchange() //
.expectStatus().isOk().expectHeader().contentType(MediaTypes.HAL_JSON_UTF8) //
.expectStatus().isOk().expectHeader().contentType(MediaTypes.HAL_JSON) //
.returnResult(this.resourceEmployeeType).getResponseBody() //
.as(StepVerifier::create).expectNextMatches(employee -> {

View File

@@ -71,14 +71,6 @@ class HalLinkDiscovererUnitTest extends LinkDiscovererUnitTest {
.hasValue(expected);
}
/**
* @see #470
*/
@Test
void supportsHalUtf8() {
assertThat(getDiscoverer().supports(MediaTypes.HAL_JSON_UTF8)).isTrue();
}
@Override
protected LinkDiscoverer getDiscoverer() {
return discoverer;

View File

@@ -78,7 +78,7 @@ class RenderHypermediaForDefaultAcceptHeadersTest {
this.mockMvc.perform(get("/employees").accept(MediaType.APPLICATION_XHTML_XML, MediaType.ALL)) //
.andExpect(status().isOk())
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_UTF8_VALUE));
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_VALUE));
}
/**
@@ -91,7 +91,7 @@ class RenderHypermediaForDefaultAcceptHeadersTest {
this.mockMvc.perform(get("/employees").accept(MediaType.ALL)) //
.andExpect(status().isOk())
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_UTF8_VALUE));
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, MediaTypes.HAL_JSON_VALUE));
}
@RestController

View File

@@ -90,7 +90,7 @@ public class RepresentationModelProcessorIntegrationTest {
public void collectionModelProcessorShouldWork() throws Exception {
String results = this.mockMvc.perform(get("/employees").accept(HAL_JSON)) //
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, HAL_JSON.toString() + ";charset=UTF-8")) //
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, HAL_JSON.toString())) //
.andReturn() //
.getResponse() //
.getContentAsString();
@@ -109,7 +109,7 @@ public class RepresentationModelProcessorIntegrationTest {
public void entityModelProcessorShouldWork() throws Exception {
String results = this.mockMvc.perform(get("/employees/1").accept(HAL_JSON)) //
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, HAL_JSON.toString() + ";charset=UTF-8")) //
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, HAL_JSON.toString())) //
.andReturn() //
.getResponse() //
.getContentAsString();
@@ -125,7 +125,7 @@ public class RepresentationModelProcessorIntegrationTest {
public void wildcardProcessorShouldNotWork() throws Exception {
String results = this.mockMvc.perform(get("/employees").accept(HAL_JSON)) //
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, HAL_JSON.toString() + ";charset=UTF-8")) //
.andExpect(header().string(HttpHeaders.CONTENT_TYPE, HAL_JSON.toString())) //
.andReturn() //
.getResponse() //
.getContentAsString();

View File

@@ -71,7 +71,7 @@ class HypermediaWebFilterTest {
.accept(MediaTypes.HAL_JSON) //
.exchange() //
.expectStatus().isOk() //
.expectHeader().contentType(MediaTypes.HAL_JSON_UTF8) //
.expectHeader().contentType(MediaTypes.HAL_JSON) //
.returnResult(RepresentationModel.class) //
.getResponseBody() //
.as(StepVerifier::create) //