diff --git a/core/src/main/java/org/springframework/security/util/MethodInvocationUtils.java b/core/src/main/java/org/springframework/security/util/MethodInvocationUtils.java
index 4f29babeae..335ea1a462 100644
--- a/core/src/main/java/org/springframework/security/util/MethodInvocationUtils.java
+++ b/core/src/main/java/org/springframework/security/util/MethodInvocationUtils.java
@@ -83,7 +83,11 @@ public final class MethodInvocationUtils {
}
/**
- * Generates a MethodInvocation for specified methodName on the passed class.
+ * Generates a MethodInvocation for the specified methodName on the passed class.
+ *
+ * If a method with this name, taking no arguments does not exist, it will check through the declared
+ * methods on the class, until one is found matching the supplied name. If more than one method name matches,
+ * an IllegalArgumentException will be raised.
*
* @param clazz the class of object that will be used to find the relevant Method
* @param methodName the name of the method to find
@@ -91,7 +95,21 @@ public final class MethodInvocationUtils {
* @return a MethodInvocation, or null if there was a problem
*/
public static MethodInvocation createFromClass(Class> clazz, String methodName) {
- return createFromClass(null, clazz, methodName, null, null);
+ MethodInvocation mi = createFromClass(null, clazz, methodName, null, null);
+
+ if (mi == null) {
+ for (Method m : clazz.getDeclaredMethods()) {
+ if (m.getName().equals(methodName)) {
+ if (mi != null) {
+ throw new IllegalArgumentException("The class " + clazz + " has more than one method named" +
+ " '" + methodName + "'");
+ }
+ mi = new SimpleMethodInvocation(null, m);
+ }
+ }
+ }
+
+ return mi;
}
/**
diff --git a/core/src/test/java/org/springframework/security/util/MethodInvocationUtilsTests.java b/core/src/test/java/org/springframework/security/util/MethodInvocationUtilsTests.java
index 1b17a36edf..e7ca4b29f2 100644
--- a/core/src/test/java/org/springframework/security/util/MethodInvocationUtilsTests.java
+++ b/core/src/test/java/org/springframework/security/util/MethodInvocationUtilsTests.java
@@ -4,6 +4,7 @@ import static org.junit.Assert.*;
import org.aopalliance.intercept.MethodInvocation;
import org.junit.Test;
+import org.springframework.security.access.annotation.BusinessServiceImpl;
/**
*
@@ -19,13 +20,18 @@ public class MethodInvocationUtilsTests {
}
@Test
- public void createFromClassWithNoArgInfoReturnsNullForMethodWithArgs() {
- MethodInvocation mi = MethodInvocationUtils.createFromClass(String.class, "codePointAt");
- assertNull(mi);
+ public void createFromClassReturnsMethodIfArgInfoOmittedAndMethodNameIsUnique() {
+ MethodInvocation mi = MethodInvocationUtils.createFromClass(BusinessServiceImpl.class, "methodReturningAnArray");
+ assertNotNull(mi);
+ }
+
+ @Test(expected=IllegalArgumentException.class)
+ public void exceptionIsRaisedIfArgInfoOmittedAndMethodNameIsNotUnique() {
+ MethodInvocationUtils.createFromClass(BusinessServiceImpl.class, "methodReturningAList");
}
@Test
- public void createFromClassReturnsMethodIfGivArgInfoForMethodWithArgs() {
+ public void createFromClassReturnsMethodIfGivenArgInfoForMethodWithArgs() {
MethodInvocation mi = MethodInvocationUtils.createFromClass(null, String.class, "compareTo",
new Class>[]{String.class}, new Object[] {""});
assertNotNull(mi);