diff --git a/jaxrs/src/main/java/feign/jaxrs/JAXRSContract.java b/jaxrs/src/main/java/feign/jaxrs/JAXRSContract.java index b682fe70..bdd59252 100644 --- a/jaxrs/src/main/java/feign/jaxrs/JAXRSContract.java +++ b/jaxrs/src/main/java/feign/jaxrs/JAXRSContract.java @@ -90,7 +90,7 @@ public final class JAXRSContract extends Contract.BaseContract { String pathValue = emptyToNull(Path.class.cast(methodAnnotation).value()); checkState(pathValue != null, "Path.value() was empty on method %s", method.getName()); String methodAnnotationValue = Path.class.cast(methodAnnotation).value(); - if (!methodAnnotationValue.startsWith("/") && !data.template().toString().endsWith("/")) { + if (!methodAnnotationValue.startsWith("/") && !data.template().url().endsWith("/")) { methodAnnotationValue = "/" + methodAnnotationValue; } // jax-rs allows whitespace around the param name, as well as an optional regex. The contract should diff --git a/jaxrs/src/test/java/feign/jaxrs/JAXRSContractTest.java b/jaxrs/src/test/java/feign/jaxrs/JAXRSContractTest.java index 73732426..3a904b39 100644 --- a/jaxrs/src/test/java/feign/jaxrs/JAXRSContractTest.java +++ b/jaxrs/src/test/java/feign/jaxrs/JAXRSContractTest.java @@ -361,6 +361,12 @@ public class JAXRSContractTest { .hasUrl("/base/specific"); } + @Test + public void methodPathWithoutLeadingSlashParsesCorrectly() throws Exception { + assertThat(parseAndValidateMetadata(MethodWithFirstPathThenGetWithoutLeadingSlash.class, "get").template()) + .hasUrl("/base/specific"); + } + interface Methods { @POST @@ -568,6 +574,13 @@ public class JAXRSContractTest { Response get(); } + @Path("/base/") + interface MethodWithFirstPathThenGetWithoutLeadingSlash { + @Path("specific") + @GET + Response get(); + } + private MethodMetadata parseAndValidateMetadata(Class targetType, String method, Class... parameterTypes) throws NoSuchMethodException {