Skip to content

Commit 49c600b

Browse files
committed
Resolved cyclic dependency between handler.invocation and handler.annotation
Issue: SPR-12696
1 parent e83d495 commit 49c600b

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

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

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import org.springframework.messaging.handler.HandlerMethod;
4242
import org.springframework.messaging.handler.HandlerMethodSelector;
4343
import org.springframework.messaging.handler.MessagingAdviceBean;
44-
import org.springframework.messaging.handler.annotation.support.AnnotationExceptionHandlerMethodResolver;
4544
import org.springframework.messaging.support.MessageBuilder;
4645
import org.springframework.messaging.support.MessageHeaderAccessor;
4746
import org.springframework.util.ClassUtils;
@@ -333,18 +332,8 @@ protected HandlerMethod createHandlerMethod(Object handler, Method method) {
333332
* (e.g. to support "global" {@code @MessageExceptionHandler}).
334333
* @since 4.2
335334
*/
336-
protected void initMessagingAdviceCache(List<MessagingAdviceBean> beans) {
337-
if (beans == null) {
338-
return;
339-
}
340-
for (MessagingAdviceBean bean : beans) {
341-
Class<?> beanType = bean.getBeanType();
342-
AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(beanType);
343-
if (resolver.hasExceptionMappings()) {
344-
this.exceptionHandlerAdviceCache.put(bean, resolver);
345-
logger.info("Detected @MessageExceptionHandler methods in " + bean);
346-
}
347-
}
335+
protected void registerExceptionHandlerAdvice(MessagingAdviceBean bean, AbstractExceptionHandlerMethodResolver resolver) {
336+
this.exceptionHandlerAdviceCache.put(bean, resolver);
348337
}
349338

350339

spring-websocket/src/main/java/org/springframework/web/socket/messaging/WebSocketAnnotationMethodMessageHandler.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16+
1617
package org.springframework.web.socket.messaging;
1718

1819
import java.util.ArrayList;
@@ -22,6 +23,7 @@
2223
import org.springframework.messaging.MessageChannel;
2324
import org.springframework.messaging.SubscribableChannel;
2425
import org.springframework.messaging.handler.MessagingAdviceBean;
26+
import org.springframework.messaging.handler.annotation.support.AnnotationExceptionHandlerMethodResolver;
2527
import org.springframework.messaging.simp.SimpMessageSendingOperations;
2628
import org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler;
2729
import org.springframework.web.method.ControllerAdviceBean;
@@ -36,7 +38,6 @@
3638
*/
3739
public class WebSocketAnnotationMethodMessageHandler extends SimpAnnotationMethodMessageHandler {
3840

39-
4041
public WebSocketAnnotationMethodMessageHandler(SubscribableChannel clientInChannel, MessageChannel clientOutChannel,
4142
SimpMessageSendingOperations brokerTemplate) {
4243

@@ -62,6 +63,20 @@ private void initControllerAdviceCache() {
6263
initMessagingAdviceCache(MessagingControllerAdviceBean.createFromList(controllerAdvice));
6364
}
6465

66+
private void initMessagingAdviceCache(List<MessagingAdviceBean> beans) {
67+
if (beans == null) {
68+
return;
69+
}
70+
for (MessagingAdviceBean bean : beans) {
71+
Class<?> beanType = bean.getBeanType();
72+
AnnotationExceptionHandlerMethodResolver resolver = new AnnotationExceptionHandlerMethodResolver(beanType);
73+
if (resolver.hasExceptionMappings()) {
74+
registerExceptionHandlerAdvice(bean, resolver);
75+
logger.info("Detected @MessageExceptionHandler methods in " + bean);
76+
}
77+
}
78+
}
79+
6580

6681
/**
6782
* Adapt ControllerAdviceBean to MessagingAdviceBean.
@@ -70,7 +85,6 @@ private static class MessagingControllerAdviceBean implements MessagingAdviceBea
7085

7186
private final ControllerAdviceBean adviceBean;
7287

73-
7488
private MessagingControllerAdviceBean(ControllerAdviceBean adviceBean) {
7589
this.adviceBean = adviceBean;
7690
}

0 commit comments

Comments
 (0)