diff --git a/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java b/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java index 760575b1..402ec4f0 100644 --- a/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/server/core/AnnotationMappingDiscoverer.java @@ -15,7 +15,7 @@ */ package org.springframework.hateoas.server.core; -import static java.util.Optional.ofNullable; +import static java.util.Optional.*; import static org.springframework.core.annotation.AnnotatedElementUtils.*; import static org.springframework.core.annotation.AnnotationUtils.*; @@ -169,8 +169,13 @@ public class AnnotationMappingDiscoverer implements MappingDiscoverer { : Arrays.stream(mediaTypes).map(MediaType::parseMediaType).collect(Collectors.toList()); } + /* + * (non-Javadoc) + * @see org.springframework.hateoas.server.core.MappingDiscoverer#getParams(java.lang.reflect.Method) + */ @Override public String[] getParams(Method method) { + Annotation annotation = findMergedAnnotation(method, annotationType); String[] params = (String[]) getValue(annotation, "params"); diff --git a/src/main/java/org/springframework/hateoas/server/core/CachingMappingDiscoverer.java b/src/main/java/org/springframework/hateoas/server/core/CachingMappingDiscoverer.java index 979e250f..8159fdd4 100644 --- a/src/main/java/org/springframework/hateoas/server/core/CachingMappingDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/server/core/CachingMappingDiscoverer.java @@ -105,6 +105,10 @@ public class CachingMappingDiscoverer implements MappingDiscoverer { return delegate.getConsumes(method); } + /* + * (non-Javadoc) + * @see org.springframework.hateoas.server.core.MappingDiscoverer#getParams(java.lang.reflect.Method) + */ @Override public String[] getParams(Method method) { return delegate.getParams(method); diff --git a/src/main/java/org/springframework/hateoas/server/core/MappingDiscoverer.java b/src/main/java/org/springframework/hateoas/server/core/MappingDiscoverer.java index 739fcf49..a58c67c6 100644 --- a/src/main/java/org/springframework/hateoas/server/core/MappingDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/server/core/MappingDiscoverer.java @@ -82,8 +82,11 @@ public interface MappingDiscoverer { List getConsumes(Method method); /** - * @param method - must not be null. + * Returns the statically declared request parameters. + * + * @param method must not be {@literal null}. * @return the parameters of the mapped request, narrowing the primary mapping. + * @since 1.4 */ String[] getParams(Method method); } diff --git a/src/main/java/org/springframework/hateoas/server/core/PropertyResolvingMappingDiscoverer.java b/src/main/java/org/springframework/hateoas/server/core/PropertyResolvingMappingDiscoverer.java index 4f6cec5e..265aed2e 100644 --- a/src/main/java/org/springframework/hateoas/server/core/PropertyResolvingMappingDiscoverer.java +++ b/src/main/java/org/springframework/hateoas/server/core/PropertyResolvingMappingDiscoverer.java @@ -92,6 +92,10 @@ class PropertyResolvingMappingDiscoverer implements MappingDiscoverer { return delegate.getConsumes(method); } + /* + * (non-Javadoc) + * @see org.springframework.hateoas.server.core.MappingDiscoverer#getParams(java.lang.reflect.Method) + */ @Override public String[] getParams(Method method) { return delegate.getParams(method); diff --git a/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java b/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java index 26779b49..10eef1f0 100644 --- a/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java +++ b/src/main/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactory.java @@ -24,7 +24,9 @@ import java.util.List; import java.util.Map; import java.util.function.Function; import java.util.function.Supplier; + import javax.servlet.ServletContext; + import org.springframework.core.MethodParameter; import org.springframework.core.convert.ConversionService; import org.springframework.format.support.DefaultFormattingConversionService; @@ -124,14 +126,19 @@ public class WebMvcLinkBuilderFactory implements MethodLinkBuilderFactory expression: paramsRequestCondition.getExpressions()) { + + for (NameValueExpression expression : paramsRequestCondition.getExpressions()) { + if (expression.isNegated()) { continue; } + String value = expression.getValue(); - if (value == null){ + + if (value == null) { continue; } + builder.queryParam(expression.getName(), value); } diff --git a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactoryUnitTest.java b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactoryUnitTest.java index 0b1a88b7..0b1dc899 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactoryUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderFactoryUnitTest.java @@ -114,13 +114,6 @@ class WebMvcLinkBuilderFactoryUnitTest extends TestUtils { assertThat(link.getHref()).endsWith("/something/with%20blank/foo"); } - @Test - void linksToMethodWithPrimaryParam(){ - Link link = linkTo(methodOn(ControllerWithMethods.class).methodWithPrimaryParams()).withSelfRel(); - assertThat(link.getRel()).isEqualTo(IanaLinkRelations.SELF); - assertThat(link.getHref()).endsWith("/something/foo?a=1&b=2"); - } - /** * @see #96 */ @@ -182,6 +175,15 @@ class WebMvcLinkBuilderFactoryUnitTest extends TestUtils { assertThat(link.getHref()).endsWith("/people/17/addresses"); } + @Test // #467 + void linksToMethodWithPrimaryParam() { + + Link link = linkTo(methodOn(ControllerWithMethods.class).methodWithPrimaryParams()).withSelfRel(); + + assertThat(link.getRel()).isEqualTo(IanaLinkRelations.SELF); + assertThat(link.getHref()).endsWith("/something/foo?a=1&b=2"); + } + interface SampleController { @RequestMapping("/sample/{id}") diff --git a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java index b13143b4..0a79f32e 100644 --- a/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java +++ b/src/test/java/org/springframework/hateoas/server/mvc/WebMvcLinkBuilderUnitTest.java @@ -667,8 +667,8 @@ class WebMvcLinkBuilderUnitTest extends TestUtils { return null; } - @RequestMapping(path = "/foo", params = {"a=1", "b=2", "c!=4", "!d"}) - HttpEntity methodWithPrimaryParams(){ + @RequestMapping(path = "/foo", params = { "a=1", "b=2", "c!=4", "!d" }) + HttpEntity methodWithPrimaryParams() { return null; }