diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java index d23d4b7bb43..dcee11e7365 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilder.java @@ -742,8 +742,8 @@ public class MvcUriComponentsBuilder { @Override @Nullable - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - return intercept(proxy, method, args, null); + public Object invoke(Object proxy, Method method, @Nullable Object[] args) { + return intercept(proxy, method, (args != null ? args : new Object[0]), null); } @Override diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java index cdbc0fa10c0..2b5da88e0d5 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/MvcUriComponentsBuilderTests.java @@ -287,6 +287,14 @@ public class MvcUriComponentsBuilderTests { assertThat(uriComponents.toUriString()).isEqualTo("http://localhost/input"); } + @Test + public void fromMethodCallOnSubclass() { + UriComponents uriComponents = fromMethodCall(on(ExtendedController.class).myMethod(null)).build(); + + assertThat(uriComponents.toUriString()).startsWith("http://localhost"); + assertThat(uriComponents.toUriString()).endsWith("/extended/else"); + } + @Test public void fromMethodCallPlain() { UriComponents uriComponents = fromMethodCall(on(ControllerWithMethods.class).myMethod(null)).build(); @@ -296,11 +304,27 @@ public class MvcUriComponentsBuilderTests { } @Test - public void fromMethodCallOnSubclass() { - UriComponents uriComponents = fromMethodCall(on(ExtendedController.class).myMethod(null)).build(); + public void fromMethodCallPlainWithNoArguments() { + UriComponents uriComponents = fromMethodCall(on(ControllerWithMethods.class).myMethod()).build(); assertThat(uriComponents.toUriString()).startsWith("http://localhost"); - assertThat(uriComponents.toUriString()).endsWith("/extended/else"); + assertThat(uriComponents.toUriString()).endsWith("/something/noarg"); + } + + @Test + public void fromMethodCallPlainOnInterface() { + UriComponents uriComponents = fromMethodCall(on(ControllerInterface.class).myMethod(null)).build(); + + assertThat(uriComponents.toUriString()).startsWith("http://localhost"); + assertThat(uriComponents.toUriString()).endsWith("/something/else"); + } + + @Test + public void fromMethodCallPlainWithNoArgumentsOnInterface() { + UriComponents uriComponents = fromMethodCall(on(ControllerInterface.class).myMethod()).build(); + + assertThat(uriComponents.toUriString()).startsWith("http://localhost"); + assertThat(uriComponents.toUriString()).endsWith("/something/noarg"); } @Test @@ -553,6 +577,11 @@ public class MvcUriComponentsBuilderTests { return null; } + @RequestMapping("/noarg") + HttpEntity myMethod() { + return null; + } + @RequestMapping("/{id}/foo") HttpEntity methodWithPathVariable(@PathVariable String id) { return null; @@ -594,6 +623,17 @@ public class MvcUriComponentsBuilderTests { } + @RequestMapping("/something") + public interface ControllerInterface { + + @RequestMapping("/else") + HttpEntity myMethod(@RequestBody Object payload); + + @RequestMapping("/noarg") + HttpEntity myMethod(); + } + + @RequestMapping("/user/{userId}/contacts") static class UserContactController {