diff --git a/src/main/java/org/springframework/hateoas/hal/Jackson2HalModule.java b/src/main/java/org/springframework/hateoas/hal/Jackson2HalModule.java index e3af51a8..e7f54b84 100644 --- a/src/main/java/org/springframework/hateoas/hal/Jackson2HalModule.java +++ b/src/main/java/org/springframework/hateoas/hal/Jackson2HalModule.java @@ -120,9 +120,7 @@ public class Jackson2HalModule extends SimpleModule { /* * (non-Javadoc) - * - * @see com.fasterxml.jackson.databind.ser.std.StdSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, - * com.fasterxml.jackson.databind.SerializerProvider) + * @see com.fasterxml.jackson.databind.ser.std.StdSerializer#serialize(java.lang.Object, com.fasterxml.jackson.core.JsonGenerator, com.fasterxml.jackson.databind.SerializerProvider) */ @Override public void serialize(List value, JsonGenerator jgen, SerializerProvider provider) throws IOException, @@ -145,7 +143,9 @@ public class Jackson2HalModule extends SimpleModule { if (prefixingRequired) { Object curieInformation = curieProvider.getCurieInformation(); - sortedLinks.put("curies", Arrays.asList(curieInformation)); + List curies = new ArrayList(); + curies.add(Arrays.asList(curieInformation)); + sortedLinks.put("curies", curies); } TypeFactory typeFactory = provider.getConfig().getTypeFactory(); @@ -161,9 +161,7 @@ public class Jackson2HalModule extends SimpleModule { /* * (non-Javadoc) - * - * @see com.fasterxml.jackson.databind.ser.ContextualSerializer#createContextual(com.fasterxml.jackson.databind.SerializerProvider, - * com.fasterxml.jackson.databind.BeanProperty) + * @see com.fasterxml.jackson.databind.ser.ContextualSerializer#createContextual(com.fasterxml.jackson.databind.SerializerProvider, com.fasterxml.jackson.databind.BeanProperty) */ @Override public JsonSerializer createContextual(SerializerProvider provider, BeanProperty property) @@ -173,7 +171,6 @@ public class Jackson2HalModule extends SimpleModule { /* * (non-Javadoc) - * * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentType() */ @Override @@ -183,7 +180,6 @@ public class Jackson2HalModule extends SimpleModule { /* * (non-Javadoc) - * * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#getContentSerializer() */ @Override @@ -193,29 +189,25 @@ public class Jackson2HalModule extends SimpleModule { /* * (non-Javadoc) - * * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#isEmpty(java.lang.Object) */ @Override public boolean isEmpty(List value) { - return false; + return value.isEmpty(); } /* * (non-Javadoc) - * * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#hasSingleElement(java.lang.Object) */ @Override public boolean hasSingleElement(List value) { - return false; + return value.size() == 1; } /* * (non-Javadoc) - * - * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#_withValueTypeSerializer(com.fasterxml.jackson.databind.jsontype. - * TypeSerializer) + * @see com.fasterxml.jackson.databind.ser.ContainerSerializer#_withValueTypeSerializer(com.fasterxml.jackson.databind.jsontype.TypeSerializer) */ @Override protected ContainerSerializer _withValueTypeSerializer(TypeSerializer vts) { @@ -287,25 +279,21 @@ public class Jackson2HalModule extends SimpleModule { @Override public JsonSerializer getContentSerializer() { - // TODO Auto-generated method stub return null; } @Override public boolean isEmpty(Collection value) { - // TODO Auto-generated method stub - return false; + return value.isEmpty(); } @Override public boolean hasSingleElement(Collection value) { - // TODO Auto-generated method stub - return false; + return value.size() == 1; } @Override protected ContainerSerializer _withValueTypeSerializer(TypeSerializer vts) { - // TODO Auto-generated method stub return null; } } diff --git a/src/test/java/org/springframework/hateoas/hal/Jackson2HalIntegrationTest.java b/src/test/java/org/springframework/hateoas/hal/Jackson2HalIntegrationTest.java index d7133051..d2fd5c77 100644 --- a/src/test/java/org/springframework/hateoas/hal/Jackson2HalIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/hal/Jackson2HalIntegrationTest.java @@ -54,13 +54,14 @@ public class Jackson2HalIntegrationTest extends AbstractJackson2MarshallingInteg static final String LIST_EMBEDDED_RESOURCE_REFERENCE = "{\"_links\":{\"self\":{\"href\":\"localhost\"}},\"_embedded\":{\"content\":[{\"text\":\"test1\",\"number\":1,\"_links\":{\"self\":{\"href\":\"localhost\"}}},{\"text\":\"test2\",\"number\":2,\"_links\":{\"self\":{\"href\":\"localhost\"}}}]}}"; static final String ANNOTATED_EMBEDDED_RESOURCE_REFERENCE = "{\"_links\":{\"self\":{\"href\":\"localhost\"}},\"_embedded\":{\"pojo\":{\"text\":\"test1\",\"number\":1,\"_links\":{\"self\":{\"href\":\"localhost\"}}}}}"; - static final String ANNOTATED_EMBEDDED_RESOURCES_REFERENCE = "{\"_links\":{},\"_embedded\":{\"pojos\":[{\"text\":\"test1\",\"number\":1,\"_links\":{\"self\":{\"href\":\"localhost\"}}},{\"text\":\"test2\",\"number\":2,\"_links\":{\"self\":{\"href\":\"localhost\"}}}]}}"; + static final String ANNOTATED_EMBEDDED_RESOURCES_REFERENCE = "{\"_embedded\":{\"pojos\":[{\"text\":\"test1\",\"number\":1,\"_links\":{\"self\":{\"href\":\"localhost\"}}},{\"text\":\"test2\",\"number\":2,\"_links\":{\"self\":{\"href\":\"localhost\"}}}]}}"; static final String ANNOTATED_PAGED_RESOURCES = "{\"_links\":{\"next\":{\"href\":\"foo\"},\"prev\":{\"href\":\"bar\"}},\"_embedded\":{\"pojos\":[{\"text\":\"test1\",\"number\":1,\"_links\":{\"self\":{\"href\":\"localhost\"}}},{\"text\":\"test2\",\"number\":2,\"_links\":{\"self\":{\"href\":\"localhost\"}}}]},\"page\":{\"size\":2,\"totalElements\":4,\"totalPages\":2,\"number\":0}}"; static final Links PAGINATION_LINKS = new Links(new Link("foo", Link.REL_NEXT), new Link("bar", Link.REL_PREVIOUS)); - static final String CURIED_DOCUMENT = "{\"_links\":{\"self\":{\"href\":\"foo\"},\"foo:myrel\":{\"href\":\"bar\"},\"curies\":{\"href\":\"htp://localhost:8080/rels/{rel}\",\"name\":\"foo\",\"templated\":true}},\"_embedded\":{}}"; + static final String CURIED_DOCUMENT = "{\"_links\":{\"self\":{\"href\":\"foo\"},\"foo:myrel\":{\"href\":\"bar\"},\"curies\":[{\"href\":\"http://localhost:8080/rels/{rel}\",\"name\":\"foo\",\"templated\":true}]}}"; + static final String EMPTY_DOCUMENT = "{}"; @Before public void setUpModule() { @@ -278,16 +279,17 @@ public class Jackson2HalIntegrationTest extends AbstractJackson2MarshallingInteg @Test public void rendersCuriesCorrectly() throws Exception { - CurieProvider curieProvider = new DefaultCurieProvider("foo", new UriTemplate("htp://localhost:8080/rels/{rel}")); - - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new Jackson2HalModule()); - mapper.setHandlerInstantiator(new HalHandlerInstantiator(new AnnotationRelProvider(), curieProvider)); - Resources resources = new Resources(Collections.emptySet(), new Link("foo"), new Link("bar", "myrel")); - assertThat(mapper.writeValueAsString(resources), is(CURIED_DOCUMENT)); + assertThat(getCuriedObjectMapper().writeValueAsString(resources), is(CURIED_DOCUMENT)); + } + + @Test + public void doesNotRenderCuriesIfNoLinkIsPresent() throws Exception { + + Resources resources = new Resources(Collections.emptySet()); + assertThat(getCuriedObjectMapper().writeValueAsString(resources), is(EMPTY_DOCUMENT)); } private static Resources> setupAnnotatedPagedResources() { @@ -316,4 +318,15 @@ public class Jackson2HalIntegrationTest extends AbstractJackson2MarshallingInteg return new Resources>(content); } + + private static ObjectMapper getCuriedObjectMapper() { + + CurieProvider curieProvider = new DefaultCurieProvider("foo", new UriTemplate("http://localhost:8080/rels/{rel}")); + + ObjectMapper mapper = new ObjectMapper(); + mapper.registerModule(new Jackson2HalModule()); + mapper.setHandlerInstantiator(new HalHandlerInstantiator(new AnnotationRelProvider(), curieProvider)); + + return mapper; + } }