Fix NPE in DefaultSimpUserRegistry

This commit is contained in:
Rossen Stoyanchev 2015-05-22 13:43:02 -04:00
parent 92bd7bba50
commit c48e8708a7
4 changed files with 24 additions and 8 deletions

View File

@ -34,7 +34,7 @@ import org.springframework.messaging.Message;
import org.springframework.messaging.MessageDeliveryException;
import org.springframework.messaging.converter.MessageConversionException;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.converter.StringMessageConverter;
import org.springframework.messaging.converter.SimpleMessageConverter;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.messaging.support.MessageHeaderAccessor;
import org.springframework.messaging.tcp.TcpConnection;
@ -82,7 +82,7 @@ public class DefaultStompSession implements ConnectionHandlingStompSession {
private final SettableListenableFuture<StompSession> sessionFuture = new SettableListenableFuture<StompSession>();
private MessageConverter converter = new StringMessageConverter();
private MessageConverter converter = new SimpleMessageConverter();
private TaskScheduler taskScheduler;
@ -141,7 +141,7 @@ public class DefaultStompSession implements ConnectionHandlingStompSession {
* Set the {@link MessageConverter} to use to convert the payload of incoming
* and outgoing messages to and from {@code byte[]} based on object type, or
* expected object type, and the "content-type" header.
* <p>By default, {@link StringMessageConverter} is configured.
* <p>By default, {@link SimpleMessageConverter} is configured.
* @param messageConverter the message converter to use
*/
public void setMessageConverter(MessageConverter messageConverter) {
@ -415,7 +415,8 @@ public class DefaultStompSession implements ConnectionHandlingStompSession {
Class<?> payloadType = ResolvableType.forType(type).getRawClass();
Object object = getMessageConverter().fromMessage(message, payloadType);
if (object == null) {
throw new MessageConversionException("No suitable converter, payloadType=" + payloadType);
throw new MessageConversionException("No suitable converter, payloadType=" + payloadType +
", handlerType=" + handler.getClass());
}
handler.handleFrame(stompHeaders, object);
}

View File

@ -18,7 +18,7 @@ package org.springframework.messaging.simp.stomp;
import java.util.Arrays;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.converter.StringMessageConverter;
import org.springframework.messaging.converter.SimpleMessageConverter;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.util.Assert;
@ -41,7 +41,7 @@ import org.springframework.util.Assert;
*/
public abstract class StompClientSupport {
private MessageConverter messageConverter = new StringMessageConverter();
private MessageConverter messageConverter = new SimpleMessageConverter();
private TaskScheduler taskScheduler;
@ -54,7 +54,7 @@ public abstract class StompClientSupport {
* Set the {@link MessageConverter} to use to convert the payload of incoming
* and outgoing messages to and from {@code byte[]} based on object type
* and the "content-type" header.
* <p>By default, {@link StringMessageConverter} is configured.
* <p>By default, {@link SimpleMessageConverter} is configured.
* @param messageConverter the message converter to use
*/
public void setMessageConverter(MessageConverter messageConverter) {

View File

@ -178,7 +178,7 @@ public class DefaultSimpUserRegistry implements SimpUserRegistry, SmartApplicati
@Override
public SimpSession getSession(String sessionId) {
return this.sessions.get(sessionId);
return (sessionId != null ? this.sessions.get(sessionId) : null);
}
@Override

View File

@ -162,6 +162,21 @@ public class DefaultSimpUserRegistryTests {
assertEquals(new HashSet<>(Arrays.asList("sub1", "sub2")), sessionIds);
}
@Test
public void nullSessionId() throws Exception {
DefaultSimpUserRegistry registry = new DefaultSimpUserRegistry();
TestPrincipal user = new TestPrincipal("joe");
Message<byte[]> message = createMessage(SimpMessageType.CONNECT_ACK, "123");
SessionConnectedEvent event = new SessionConnectedEvent(this, message, user);
registry.onApplicationEvent(event);
SimpUser simpUser = registry.getUser("joe");
assertNull(simpUser.getSession(null));
}
private Message<byte[]> createMessage(SimpMessageType type, String sessionId) {
return createMessage(type, sessionId, null, null);
}