#470 - Added HAL JSON UTF-8 variant to MediaTypes.

Added application/hal+json;charset=UTF-8 to the media types enum. Traverson now configures all HAL flavors to be supported by the registered HAL-specific HttpMessageConverter.

Removed nullability of media type in JsonPathLinkDiscoverer. This requires subclasses that want to support all media types to explicitly configure MediaType.ALL.

Heavily inspired by the PR submitted by @drummond but very significantly rewritten.
This commit is contained in:
Oliver Gierke
2017-03-28 00:18:02 -04:00
parent 05f687ef39
commit 312134ee82
8 changed files with 100 additions and 32 deletions

View File

@@ -21,6 +21,7 @@ import java.net.URI;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
@@ -130,13 +131,34 @@ public class Traverson {
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
converters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
if (mediaTypes.contains(MediaTypes.HAL_JSON)) {
converters.add(getHalConverter());
List<MediaType> halFlavors = getHalJsonFlavors(mediaTypes);
if (!halFlavors.isEmpty()) {
converters.add(getHalConverter(halFlavors));
}
return converters;
}
/**
* Returns all HAL JSON compatible media types from the given list.
*
* @param mediaTypes must not be {@literal null}.
* @return
*/
private static List<MediaType> getHalJsonFlavors(Collection<MediaType> mediaTypes) {
List<MediaType> result = new ArrayList<MediaType>();
for (MediaType mediaType : mediaTypes) {
if (MediaTypes.HAL_JSON.isCompatibleWith(mediaType)) {
result.add(mediaType);
}
}
return result;
}
private static final RestOperations createDefaultTemplate(List<MediaType> mediaTypes) {
RestTemplate template = new RestTemplate();
@@ -150,7 +172,7 @@ public class Traverson {
*
* @return
*/
private static final HttpMessageConverter<?> getHalConverter() {
private static final HttpMessageConverter<?> getHalConverter(List<MediaType> halFlavours) {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jackson2HalModule());
@@ -159,7 +181,7 @@ public class Traverson {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(mapper);
converter.setSupportedMediaTypes(Arrays.asList(MediaTypes.HAL_JSON));
converter.setSupportedMediaTypes(halFlavours);
return converter;
}