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

View File

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

View File

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

View File

@ -162,6 +162,21 @@ public class DefaultSimpUserRegistryTests {
assertEquals(new HashSet<>(Arrays.asList("sub1", "sub2")), sessionIds); 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) { private Message<byte[]> createMessage(SimpMessageType type, String sessionId) {
return createMessage(type, sessionId, null, null); return createMessage(type, sessionId, null, null);
} }