2014-10-31 61 views
2

我们试图将我们的项目之一从Spring 4.0.7.RELEASE迁移到4.1.1.RELEASE。 之后,我们得到以下错误。Spring 4.1.1 WebSocket Stomp子协议错误

java.lang.IllegalStateException: Multiple protocol handlers configured and no protocol was negotiated. Consider configuring a default SubProtocolHandler. 
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.findProtocolHandler(SubProtocolWebSocketHandler.java:294) 
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.clearSession(SubProtocolWebSocketHandler.java:433) 
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.afterConnectionClosed(SubProtocolWebSocketHandler.java:423) 
at org.springframework.web.socket.handler.WebSocketHandlerDecorator.afterConnectionClosed(WebSocketHandlerDecorator.java:85) 
at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.afterConnectionClosed(LoggingWebSocketHandlerDecorator.java:71) 
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.afterConnectionClosed(ExceptionWebSocketHandlerDecorator.java:91) 
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.close(AbstractSockJsSession.java:291) 
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.tryCloseWithError(ExceptionWebSocketHandlerDecorator.java:60) 
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.afterConnectionEstablished(ExceptionWebSocketHandlerDecorator.java:50) 
at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.delegateConnectionEstablished(AbstractSockJsSession.java:207) 
at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.initializeDelegateSession(WebSocketServerSockJsSession.java:159) 
at org.springframework.web.socket.sockjs.transport.handler.SockJsWebSocketHandler.afterConnectionEstablished(SockJsWebSocketHandler.java:87) 
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.onOpen(StandardWebSocketHandlerAdapter.java:101) 
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:129) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:633) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1721) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1679) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at java.lang.Thread.run(Thread.java:745) 

我们没有的配置改变任何东西(而不能发现,我们必须改变任何暗示)。

这是我们的WebSockets的服务器端配置。 (它实际上和Spring文档中的一样)。

@Configuration 
@EnableWebSocketMessageBroker 

public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer { 

@Override 
public void registerStompEndpoints(final StompEndpointRegistry registry) { 
    registry.addEndpoint("/tyresearch").withSockJS(); 
    registry.addEndpoint("/tyresearch/changeConfiguration").withSockJS(); 
    registry.addEndpoint("/tyresearch/detailView").withSockJS(); 
} 

@Override 
public void configureMessageBroker(final MessageBrokerRegistry config) { 
    config.enableSimpleBroker("/topic"); 
    config.setApplicationDestinationPrefixes("/app"); 
} 
} 

而且我们对每个类似下面的方法之前描述的端点:从JavaScript

@MessageMapping("/tyresearch") 
public void startTyreSearch(@Payload final TyreSearchRequestContainerDto message, final Principal user, final StompHeaderAccessor) { 
    .... 
} 

客户端调用看起来像下面这样:

var socket = new $wnd.SockJS('/server/api/rest/tyresearch'); 
    var stompClient = $wnd.Stomp.over(socket); 
    stompClient.connect({}, function(frame) { 
     console.log('Connected: ' + frame); 
    }); 

是否有人有一个想法,有什么变化让我们陷入困境,以及如何解决这个问题?

非常感谢。

回答

1

首先它真的是bug。谢谢你指出!

我们提出了一个问题(https://jira.spring.io/browse/SPR-12403),它将在下周内修复。

在此之前,你难道不能用单一的端点克服单块端点的恶意映射吗?

UPDATE

我得到它告诉我,协议跺脚1.0,1.1和1.2都已经映射

因为我们确实有一个问题在这里一个错误,你需要克服它不知何故,我建议你尝试越过豆:

@Bean 
    public WebSocketHandler subProtocolWebSocketHandler() { 
     return new SubProtocolWebSocketHandler(clientInboundChannel(), clientOutboundChannel()); 
    } 

与您的自定义实现,whe addProtocolHandler将有一个空的身体,因为你说你已经定义了STOMP作为默认值。有了该框架将无法添加更多SubProtocolHandler s。

+0

你好,谢谢你的回答。我试着设置defaultSubProtocols和这些东西,但运行在不同的其他错误然后(例如,如果我明确地将stomp协议设置为SubProtocolWebSocketHandler bean的默认值,我得到一个错误告诉我,协议脚本1.0,1.1和1.2是已经映射) 也许我在这里做了错误,所以如果你有一个配置示例,我可以做到这一点,我会试试看。 – Koizumi 2014-11-03 12:08:25

+0

在答案中增加了一个解决方法 – 2014-11-03 12:33:18

+0

该问题已经修复为4.1.2 - 将于本周发布。 – 2014-11-03 13:58:08