From 6673f1987fac9f9efba35269bca61a85d433f53c Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Sun, 29 Dec 2013 18:59:35 +0100 Subject: [PATCH] #133 - Made JsonPathLinkDiscoverer more robust. JsonPathLinkDiscoverer now handles InvalidPathExceptions that might occur if the representation doesn't contain the link container element. --- .../hateoas/core/JsonPathLinkDiscoverer.java | 9 +++++++-- .../core/AbstractLinkDiscovererUnitTest.java | 13 ++++++++++++- .../hateoas/hal/HalLinkDiscovererUnitTest.java | 5 +++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java b/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java index 27d89b92..a57c9a40 100644 --- a/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java @@ -30,6 +30,7 @@ import org.springframework.http.MediaType; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import com.jayway.jsonpath.InvalidPathException; import com.jayway.jsonpath.JsonPath; /** @@ -88,8 +89,12 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { @Override public List findLinksWithRel(String rel, String representation) { - Object parseResult = getExpression(rel).read(representation); - return createLinksFrom(parseResult, rel); + try { + Object parseResult = getExpression(rel).read(representation); + return createLinksFrom(parseResult, rel); + } catch (InvalidPathException e) { + return Collections.emptyList(); + } } /* diff --git a/src/test/java/org/springframework/hateoas/core/AbstractLinkDiscovererUnitTest.java b/src/test/java/org/springframework/hateoas/core/AbstractLinkDiscovererUnitTest.java index 59401e68..3aa26ed9 100644 --- a/src/test/java/org/springframework/hateoas/core/AbstractLinkDiscovererUnitTest.java +++ b/src/test/java/org/springframework/hateoas/core/AbstractLinkDiscovererUnitTest.java @@ -22,6 +22,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.List; +import org.hamcrest.Matchers; import org.junit.Test; import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkDiscoverer; @@ -63,12 +64,20 @@ public abstract class AbstractLinkDiscovererUnitTest { } @Test - public void returnsForInxistingLinkFromInputStream() throws Exception { + public void returnsForInexistingLinkFromInputStream() throws Exception { InputStream inputStream = new ByteArrayInputStream(getInputString().getBytes("UTF-8")); assertThat(getDiscoverer().findLinkWithRel("something", inputStream), is(nullValue())); } + @Test + public void returnsNullForNonExistingLinkContainer() { + + assertThat(getDiscoverer().findLinksWithRel("something", getInputStringWithoutLinkContainer()), + is(Matchers. empty())); + assertThat(getDiscoverer().findLinkWithRel("something", getInputStringWithoutLinkContainer()), is(nullValue())); + } + /** * Return the {@link LinkDiscoverer} to be tested. * @@ -82,4 +91,6 @@ public abstract class AbstractLinkDiscovererUnitTest { * @return */ protected abstract String getInputString(); + + protected abstract String getInputStringWithoutLinkContainer(); } diff --git a/src/test/java/org/springframework/hateoas/hal/HalLinkDiscovererUnitTest.java b/src/test/java/org/springframework/hateoas/hal/HalLinkDiscovererUnitTest.java index 4bb01c7b..09fea7b0 100644 --- a/src/test/java/org/springframework/hateoas/hal/HalLinkDiscovererUnitTest.java +++ b/src/test/java/org/springframework/hateoas/hal/HalLinkDiscovererUnitTest.java @@ -40,4 +40,9 @@ public class HalLinkDiscovererUnitTest extends AbstractLinkDiscovererUnitTest { protected String getInputString() { return SAMPLE; } + + @Override + protected String getInputStringWithoutLinkContainer() { + return "{}"; + } }