2014-10-31 4 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) 

구성에 아무런 변화가 없었으며 아무 것도 변경해야한다는 힌트를 찾을 수 없습니다.

다음은 웹 소켓의 서버 측 구성입니다. (사실 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"); 
} 
} 

또한 우리는 다음과 같은 방법 이전에 설명 된 엔드 포인트의 각각에 있습니다

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

사람을합니까 : 자바 스크립트에서

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

클라이언트 측 호출은 다음과 같이 보입니다 어떤 변화가 우리에게 문제를 일으키고이 문제를 해결할 수있는 아이디어를 가지고 있습니까?

대단히 감사합니다.

답변

1

첫 번째 것은 실제로 bug입니다. 지적 해 주셔서 감사합니다!

문제가 제기되어 (https://jira.spring.io/browse/SPR-12403) 다음 주에 해결 될 예정입니다.

그 전에는 단 하나의 스톰 포인트 엔드 포인트에 대한 뮤탈 매핑을 극복 할 수 없습니까?

UPDATE

내가 프로토콜 1.0, 1.1 및 1.2은 이미 우리가 정말 여기에 문제가 있기 때문에

를 매핑하는 춤추는 것을 저에게 말했다 오류를 가지고 당신이 극복해야 할 그것은 어떻게 든 bean을 재정의하려고 시도 할 것을 제안합니다 :

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

사용자 정의 구현에서는 whe 다시 addProtocolHandler은 빈 몸체가됩니다. 왜냐하면 이미 STOMP을 기본 몸체로 정의했기 때문입니다. 프레임 워크는 SubProtocolHandler을 더 이상 추가 할 수 없습니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. defaultSubProtocols 등을 설정하려고했지만 다른 다른 오류가 발생했습니다 (예를 들어 SubProtocolWebSocketHandler 빈에 명시 적으로 stomp 프로토콜을 설정하면 프로토콜 1.0, 1.1 및 1.2가 이미 매핑 됨) 어쩌면 내가 여기서 뭔가 잘못 했으므로 예제 구성을 어떻게 얻을 수 있는지, 시도해 보겠습니다. – Koizumi

+0

답변에 해결 방법을 추가했습니다. –

+0

이번 주에 릴리스 될 4.1.2 문제가 수정되었습니다. –