diff --git a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessageMapping.java b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessageMapping.java index 0796f8ee3b..ad0d4fca60 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessageMapping.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/MessageMapping.java @@ -77,6 +77,11 @@ import org.springframework.messaging.Message; * have the message directed to a specific user if connected. The return value is * converted with a {@link org.springframework.messaging.converter.MessageConverter}. * + *
NOTE: When using controller interfaces (e.g. for AOP proxying), + * make sure to consistently put all your mapping annotations - such as + * {@code @MessageMapping} and {@code @SubscribeMapping} - on + * the controller interface rather than on the implementation class. + * * @author Rossen Stoyanchev * @since 4.0 * @see org.springframework.messaging.simp.annotation.support.SimpAnnotationMethodMessageHandler diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SubscribeMapping.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SubscribeMapping.java index 370dcc9e30..83f3d2a4b5 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SubscribeMapping.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/SubscribeMapping.java @@ -40,6 +40,11 @@ import java.lang.annotation.Target; * user and does not pass through the message broker. This is useful for * implementing a request-reply pattern. * + *
NOTE: When using controller interfaces (e.g. for AOP proxying),
+ * make sure to consistently put all your mapping annotations - such as
+ * {@code @MessageMapping} and {@code @SubscribeMapping} - on
+ * the controller interface rather than on the implementation class.
+ *
* @author Rossen Stoyanchev
* @since 4.0
* @see org.springframework.messaging.handler.annotation.MessageMapping
diff --git a/src/asciidoc/web-websocket.adoc b/src/asciidoc/web-websocket.adoc
index 87c6d32b09..2872cadd65 100644
--- a/src/asciidoc/web-websocket.adoc
+++ b/src/asciidoc/web-websocket.adoc
@@ -1374,6 +1374,19 @@ Or alternatively an `@SubscribeMapping` method can be annotated with `@SendTo`
in which case the resulting message is sent to the `"brokerChannel"` using
the specified target destination.
+[NOTE]
+====
+In some cases a controller may need to be decorated with an AOP proxy at runtime.
+One example is if you choose to have `@Transactional` annotations directly on the
+controller. When this is the case, for controllers specifically, we recommend
+using class-based proxying. This is typically the default choice with controllers.
+However if a controller must implement an interface that is not a Spring Context
+callback (e.g. `InitializingBean`, `*Aware`, etc), you may need to explicitly
+configure class-based proxying. For example with `