diff --git a/pom.xml b/pom.xml index 0c6bbbce..fffb6fcf 100644 --- a/pom.xml +++ b/pom.xml @@ -63,7 +63,7 @@ 2.4.3 1.0 2.1.0 - 1.2.0 + 0.9.1 2.1 1.7.10 1.2.1 diff --git a/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java b/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java index 7a10fce3..1c340dd8 100644 --- a/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/core/JsonPathLinkDiscoverer.java @@ -17,6 +17,8 @@ package org.springframework.hateoas.core; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Array; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -28,6 +30,7 @@ import org.springframework.hateoas.Link; import org.springframework.hateoas.LinkDiscoverer; import org.springframework.http.MediaType; import org.springframework.util.Assert; +import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; import com.jayway.jsonpath.InvalidPathException; @@ -40,6 +43,29 @@ import com.jayway.jsonpath.JsonPath; */ public class JsonPathLinkDiscoverer implements LinkDiscoverer { + private static Method compileMethod; + private static Object emptyFilters; + + static { + + // Reflective bridging between JsonPath 0.9.x and 1.x + for (Method candidate : JsonPath.class.getMethods()) { + + if (candidate.getName().equals("compile")) { + + Class[] paramTypes = candidate.getParameterTypes(); + + if (paramTypes.length == 2 && paramTypes[0].equals(String.class) && paramTypes[1].isArray()) { + compileMethod = candidate; + emptyFilters = Array.newInstance(paramTypes[1].getComponentType(), 0); + break; + } + } + } + + Assert.state(compileMethod != null, "Unexpected JsonPath API - no compile(String, ...) method found"); + } + private final String pathTemplate; private final MediaType mediaType; @@ -119,7 +145,7 @@ public class JsonPathLinkDiscoverer implements LinkDiscoverer { * @return */ private JsonPath getExpression(String rel) { - return JsonPath.compile(String.format(pathTemplate, rel)); + return (JsonPath) ReflectionUtils.invokeMethod(compileMethod, null, String.format(pathTemplate, rel), emptyFilters); } /**