From ff6380063cc31ec6e4c4e766aaa2269e94b06452 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 15 Jul 2019 22:39:10 +0200 Subject: [PATCH] #1019 - Avoid exceptions on HAL link title rendering. HalLinkRelation now implements MessageSourceResolvable.getDefaultMessage() returning an empty String to avoid NoSuchMessageExceptions for every resolution not backed by an actual translation. Tweaked serialization configuration for HalLink to not render empty title strings. --- .../mediatype/hal/HalLinkRelation.java | 10 +++++++++ .../mediatype/hal/Jackson2HalModule.java | 2 +- .../hal/Jackson2HalIntegrationTest.java | 21 +++++++++++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/hateoas/mediatype/hal/HalLinkRelation.java b/src/main/java/org/springframework/hateoas/mediatype/hal/HalLinkRelation.java index d62069ce..0cd1c484 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/hal/HalLinkRelation.java +++ b/src/main/java/org/springframework/hateoas/mediatype/hal/HalLinkRelation.java @@ -174,6 +174,16 @@ public class HalLinkRelation implements LinkRelation, MessageSourceResolvable { .toArray(String[]::new); } + /* + * (non-Javadoc) + * @see org.springframework.context.MessageSourceResolvable#getDefaultMessage() + */ + @Override + @org.springframework.lang.NonNull + public String getDefaultMessage() { + return ""; + } + /** * Simple builder interface to easily create multiple {@link HalLinkRelation}s for a single curie. * diff --git a/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java b/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java index c1b22b5a..7a26649d 100644 --- a/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java +++ b/src/main/java/org/springframework/hateoas/mediatype/hal/Jackson2HalModule.java @@ -965,8 +965,8 @@ public class Jackson2HalModule extends SimpleModule { return link; } - @JsonInclude(Include.NON_NULL) @Nullable + @JsonInclude(Include.NON_EMPTY) public String getTitle() { return title; } diff --git a/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java b/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java index 2344c9a4..07cc9813 100755 --- a/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java +++ b/src/test/java/org/springframework/hateoas/mediatype/hal/Jackson2HalIntegrationTest.java @@ -495,6 +495,27 @@ public class Jackson2HalIntegrationTest extends AbstractJackson2MarshallingInteg .isEqualTo("{\"_links\":{\"foo\":[{\"href\":\"/some-href\"}]}}"); } + @Test // #1019 + void doesNotRenderTitleForEmptyString() throws Exception { + + Link link = new Link("/some-href", "foo"); + + assertThat(mapper.writeValueAsString(new Jackson2HalModule.HalLink(link, ""))) // + .isEqualTo("{\"href\":\"/some-href\"}"); + } + + @Test // #1019 + void resolvesMissingHalLinkRelationToEmptyString() throws Exception { + + HalLinkRelation relation = HalLinkRelation.of(LinkRelation.of("someRel")); + + MessageSourceAccessor accessor = new MessageSourceAccessor(new StaticMessageSource()); + + assertThatCode(() -> { + assertThat(accessor.getMessage(relation)).isEqualTo(""); + }).doesNotThrowAnyException(); + } + private void verifyResolvedTitle(String resourceBundleKey) throws Exception { LocaleContextHolder.setLocale(Locale.US);