Skip to content

Commit 1a1c72c

Browse files
committed
Revised InvocableHandlerMethod exception handling
Issue: SPR-11281
1 parent 5f1592a commit 1a1c72c

File tree

2 files changed

+25
-25
lines changed

2 files changed

+25
-25
lines changed

spring-messaging/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ public InvocableHandlerMethod(Object bean, String methodName, Class<?>... parame
7272

7373

7474
/**
75-
* Set {@link HandlerMethodArgumentResolver}s to use to use for resolving method
76-
* argument values.
75+
* Set {@link HandlerMethodArgumentResolver}s to use to use for resolving method argument values.
7776
*/
7877
public void setMessageMethodArgumentResolvers(HandlerMethodArgumentResolverComposite argumentResolvers) {
7978
this.argumentResolvers = argumentResolvers;
@@ -98,7 +97,7 @@ public final Object invoke(Message<?> message, Object... providedArgs) throws Ex
9897
Object[] args = getMethodArgumentValues(message, providedArgs);
9998
if (logger.isTraceEnabled()) {
10099
StringBuilder sb = new StringBuilder("Invoking [");
101-
sb.append(this.getBeanType().getSimpleName()).append(".");
100+
sb.append(getBeanType().getSimpleName()).append(".");
102101
sb.append(getMethod().getName()).append("] method with arguments ");
103102
sb.append(Arrays.asList(args));
104103
logger.trace(sb.toString());
@@ -118,7 +117,7 @@ private Object[] getMethodArgumentValues(Message<?> message, Object... providedA
118117
Object[] args = new Object[parameters.length];
119118
for (int i = 0; i < parameters.length; i++) {
120119
MethodParameter parameter = parameters[i];
121-
parameter.initParameterNameDiscovery(parameterNameDiscoverer);
120+
parameter.initParameterNameDiscovery(this.parameterNameDiscoverer);
122121
GenericTypeResolver.resolveParameterType(parameter, getBean().getClass());
123122
args[i] = resolveProvidedArgument(parameter, providedArgs);
124123
if (args[i] != null) {
@@ -181,17 +180,17 @@ private Object resolveProvidedArgument(MethodParameter parameter, Object... prov
181180
* Invoke the handler method with the given argument values.
182181
*/
183182
private Object invoke(Object... args) throws Exception {
184-
ReflectionUtils.makeAccessible(this.getBridgedMethod());
183+
ReflectionUtils.makeAccessible(getBridgedMethod());
185184
try {
186-
assertTargetBean(getBridgedMethod(), getBean(), args);
187185
return getBridgedMethod().invoke(getBean(), args);
188186
}
189-
catch (IllegalArgumentException e) {
190-
throw new IllegalArgumentException(getInvocationErrorMessage(e.getMessage(), args), e);
187+
catch (IllegalArgumentException ex) {
188+
assertTargetBean(getBridgedMethod(), getBean(), args);
189+
throw new IllegalStateException(getInvocationErrorMessage(ex.getMessage(), args), ex);
191190
}
192-
catch (InvocationTargetException e) {
191+
catch (InvocationTargetException ex) {
193192
// Unwrap for HandlerExceptionResolvers ...
194-
Throwable targetException = e.getTargetException();
193+
Throwable targetException = ex.getTargetException();
195194
if (targetException instanceof RuntimeException) {
196195
throw (RuntimeException) targetException;
197196
}
@@ -219,11 +218,11 @@ private void assertTargetBean(Method method, Object targetBean, Object[] args) {
219218
Class<?> methodDeclaringClass = method.getDeclaringClass();
220219
Class<?> targetBeanClass = targetBean.getClass();
221220
if (!methodDeclaringClass.isAssignableFrom(targetBeanClass)) {
222-
String message = "The mapped controller method class '" + methodDeclaringClass.getName() +
221+
String msg = "The mapped controller method class '" + methodDeclaringClass.getName() +
223222
"' is not an instance of the actual controller bean instance '" +
224223
targetBeanClass.getName() + "'. If the controller requires proxying " +
225224
"(e.g. due to @Transactional), please use class-based proxying.";
226-
throw new IllegalArgumentException(getInvocationErrorMessage(message, args));
225+
throw new IllegalStateException(getInvocationErrorMessage(msg, args));
227226
}
228227
}
229228

spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,15 @@
4747
*/
4848
public class InvocableHandlerMethod extends HandlerMethod {
4949

50-
private HandlerMethodArgumentResolverComposite argumentResolvers = new HandlerMethodArgumentResolverComposite();
51-
5250
private WebDataBinderFactory dataBinderFactory;
5351

52+
private HandlerMethodArgumentResolverComposite argumentResolvers = new HandlerMethodArgumentResolverComposite();
53+
5454
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
5555

5656

5757
/**
58-
* Creates an instance from the given handler and method.
58+
* Create an instance from the given handler and method.
5959
*/
6060
public InvocableHandlerMethod(Object bean, Method method) {
6161
super(bean, method);
@@ -124,7 +124,7 @@ public final Object invokeForRequest(NativeWebRequest request, ModelAndViewConta
124124
Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
125125
if (logger.isTraceEnabled()) {
126126
StringBuilder sb = new StringBuilder("Invoking [");
127-
sb.append(this.getBeanType().getSimpleName()).append(".");
127+
sb.append(getBeanType().getSimpleName()).append(".");
128128
sb.append(getMethod().getName()).append("] method with arguments ");
129129
sb.append(Arrays.asList(args));
130130
logger.trace(sb.toString());
@@ -154,7 +154,8 @@ private Object[] getMethodArgumentValues(NativeWebRequest request, ModelAndViewC
154154
}
155155
if (this.argumentResolvers.supportsParameter(parameter)) {
156156
try {
157-
args[i] = this.argumentResolvers.resolveArgument(parameter, mavContainer, request, this.dataBinderFactory);
157+
args[i] = this.argumentResolvers.resolveArgument(
158+
parameter, mavContainer, request, this.dataBinderFactory);
158159
continue;
159160
}
160161
catch (Exception ex) {
@@ -209,17 +210,17 @@ private Object resolveProvidedArgument(MethodParameter parameter, Object... prov
209210
* Invoke the handler method with the given argument values.
210211
*/
211212
private Object invoke(Object... args) throws Exception {
212-
ReflectionUtils.makeAccessible(this.getBridgedMethod());
213+
ReflectionUtils.makeAccessible(getBridgedMethod());
213214
try {
214-
assertTargetBean(getBridgedMethod(), getBean(), args);
215215
return getBridgedMethod().invoke(getBean(), args);
216216
}
217-
catch (IllegalArgumentException e) {
218-
throw new IllegalArgumentException(getInvocationErrorMessage(e.getMessage(), args), e);
217+
catch (IllegalArgumentException ex) {
218+
assertTargetBean(getBridgedMethod(), getBean(), args);
219+
throw new IllegalStateException(getInvocationErrorMessage(ex.getMessage(), args), ex);
219220
}
220-
catch (InvocationTargetException e) {
221+
catch (InvocationTargetException ex) {
221222
// Unwrap for HandlerExceptionResolvers ...
222-
Throwable targetException = e.getTargetException();
223+
Throwable targetException = ex.getTargetException();
223224
if (targetException instanceof RuntimeException) {
224225
throw (RuntimeException) targetException;
225226
}
@@ -247,11 +248,11 @@ private void assertTargetBean(Method method, Object targetBean, Object[] args) {
247248
Class<?> methodDeclaringClass = method.getDeclaringClass();
248249
Class<?> targetBeanClass = targetBean.getClass();
249250
if (!methodDeclaringClass.isAssignableFrom(targetBeanClass)) {
250-
String message = "The mapped controller method class '" + methodDeclaringClass.getName() +
251+
String msg = "The mapped controller method class '" + methodDeclaringClass.getName() +
251252
"' is not an instance of the actual controller bean instance '" +
252253
targetBeanClass.getName() + "'. If the controller requires proxying " +
253254
"(e.g. due to @Transactional), please use class-based proxying.";
254-
throw new IllegalArgumentException(getInvocationErrorMessage(message, args));
255+
throw new IllegalStateException(getInvocationErrorMessage(msg, args));
255256
}
256257
}
257258

0 commit comments

Comments
 (0)