From 59f39706dc4721b076b209bcd273baaa5f1335c4 Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Thu, 17 Jul 2014 07:51:36 +0200 Subject: [PATCH] Fix default target destination when using "." as path separator Issue: SPR-11660 --- .../SendToMethodReturnValueHandler.java | 7 ++++- .../SendToMethodReturnValueHandlerTests.java | 31 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java index 52df84b56d..896362180e 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandler.java @@ -32,6 +32,7 @@ import org.springframework.messaging.simp.user.DestinationUserNameProvider; import org.springframework.messaging.support.MessageHeaderInitializer; import org.springframework.util.Assert; import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; import java.lang.annotation.Annotation; import java.security.Principal; @@ -187,7 +188,11 @@ public class SendToMethodReturnValueHandler implements HandlerMethodReturnValueH } } String name = DestinationPatternsMessageCondition.LOOKUP_DESTINATION_HEADER; - return new String[] { defaultPrefix + message.getHeaders().get(name) }; + String destination = (String)message.getHeaders().get(name); + if (StringUtils.hasLength(destination) && !destination.startsWith("/")) { + destination = "/" + destination; + } + return new String[] { defaultPrefix + destination }; } private MessageHeaders createHeaders(String sessionId) { diff --git a/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandlerTests.java b/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandlerTests.java index 6d18e49698..4635c41c4b 100644 --- a/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandlerTests.java +++ b/spring-messaging/src/test/java/org/springframework/messaging/simp/annotation/support/SendToMethodReturnValueHandlerTests.java @@ -185,6 +185,21 @@ public class SendToMethodReturnValueHandlerTests { assertNull("Subscription id should not be copied", headers.getSubscriptionId()); } + @Test + public void sendToDefaultDestinationWithoutLeadingSlash() throws Exception { + + when(this.messageChannel.send(any(Message.class))).thenReturn(true); + + Message inputMessage = createInputMessage("sess1", "sub1", "/app", "dest", null); + this.handler.handleReturnValue(PAYLOAD, this.sendToDefaultDestReturnType, inputMessage); + + verify(this.messageChannel, times(1)).send(this.messageCaptor.capture()); + + Message message = this.messageCaptor.getAllValues().get(0); + SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(message); + assertEquals("/topic/dest", headers.getDestination()); + } + @Test public void testHeadersToSend() throws Exception { @@ -297,6 +312,22 @@ public class SendToMethodReturnValueHandlerTests { assertEquals("/user/" + user.getName() + "/queue/dest", headers.getDestination()); } + @Test + public void sendToUserDefaultDestinationWithoutLeadingSlash() throws Exception { + + when(this.messageChannel.send(any(Message.class))).thenReturn(true); + + TestUser user = new TestUser(); + Message inputMessage = createInputMessage("sess1", "sub1", "/app", "dest", user); + this.handler.handleReturnValue(PAYLOAD, this.sendToUserDefaultDestReturnType, inputMessage); + + verify(this.messageChannel, times(1)).send(this.messageCaptor.capture()); + + Message message = this.messageCaptor.getAllValues().get(0); + SimpMessageHeaderAccessor headers = SimpMessageHeaderAccessor.wrap(message); + assertEquals("/user/" + user.getName() + "/queue/dest", headers.getDestination()); + } + @Test public void sendToUserDefaultDestinationSingleSession() throws Exception {