5

こんにちは、websocket の新機能です。なぜこの例外が発生するのかわかりません。

 java.lang.IllegalStateException: A SockJsMessageCodec is required but not available: Add Jackson 2 to the classpath, or configure a custom SockJsMessageCodec.
    at org.springframework.util.Assert.state(Assert.java:385)
    at org.springframework.web.socket.sockjs.transport.TransportHandlingSockJsService.getMessageCodec(TransportHandlingSockJsService.java:130)
    at org.springframework.web.socket.sockjs.transport.session.WebSocketServerSockJsSession.handleMessage(WebSocketServerSockJsSession.java:187)
    at org.springframework.web.socket.sockjs.transport.handler.SockJsWebSocketHandler.handleTextMessage(SockJsWebSocketHandler.java:92)
    at org.springframework.web.socket.handler.AbstractWebSocketHandler.handleMessage(AbstractWebSocketHandler.java:43)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:112)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:42)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:82)
    at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:79)
    at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:369)
    at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:468)
    at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:272)
    at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:116)
    at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:54)
    at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler$WsReadListener.onDataAvailable(WsHttpUpgradeHandler.java:192)
    at org.apache.coyote.http11.upgrade.AbstractServletInputStream.onDataAvailable(AbstractServletInputStream.java:178)
    at org.apache.coyote.http11.upgrade.AbstractProcessor.upgradeDispatch(AbstractProcessor.java:92)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:601)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745) 

コンソールでの出力

Opening Web Socket... stomp.js:145
Web Socket Opened... stomp.js:145
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000   stomp.js:145


Whoops! Lost connection to undefined 

これは私の bjplayer-servlet.xml です

<mvc:annotation-driven/>
    <context:annotation-config/>

    <context:component-scan base-package="com.package.bjplayer"/>

    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/view"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <websocket:message-broker application-destination-prefix="/app">
        <websocket:stomp-endpoint path="/ws">
            <websocket:sockjs/>
        </websocket:stomp-endpoint>
        <websocket:simple-broker prefix="/topic"/>
    </websocket:message-broker>

私のコントローラー用

@MessageMapping("/joinRoom")
@SendTo("/topic/lobby")
public List<Room> webSocketJoinRoom(Room room){
    System.out.println("your RoomName is: "+room.getRoomName());
    return roomService.getRooms();
}

マイ JavaScript

<script type="text/javascript">

var contextPath = "${pageContext.request.contextPath}";

var socket = new SockJS(contextPath+"/ws");

var stompClient = Stomp.over(socket);

var connectCallback = function() {
      stompClient.subscribe('/topic/lobby', renderLobby);
};

var errorCallback = function(error) {
      alert("Opps Mali ka Blehh");
};

stompClient.connect({}, connectCallback, errorCallback);

function renderLobby(response) {
      var rooms = JSON.parse(response.body);
      $('#lobby').empty();
      //Somecodes....
}

$(document).ready(function() {
      $('.joinRoom').click(function(e){
        e.preventDefault();
        var roomName = $('.roomName').val();
        var jsonstr = JSON.stringify({'roomName': roomName});
        stompClient.send("/app/joinRoom", {}, jsonstr);
        return false;
      });
});

私のJsp。

Room Name: <input type="text" class="roomName" value="${room.roomName}"/>
    <button class="joinRoom">Try it</button>

私のjarファイル。

spring-beans-4.1.0.RELEASE.jar
spring-context-4.1.0.RELEASE.jar
spring-context-support-4.1.0.RELEASE.jar
spring-core-4.1.0.RELEASE.jar
spring-expression-4.1.0.RELEASE.jar
spring-jdbc-4.1.0.RELEASE.jar
spring-jms-4.1.0.RELEASE.jar
spring-messaging-4.1.0.RELEASE.jar
spring-orm-4.1.0.RELEASE.jar
spring-tx-4.1.0.RELEASE.jar
spring-web-4.1.0.RELEASE.jar
spring-webmvc-4.1.0.RELEASE.jar
spring-websocket-4.1.0.RELEASE.jar

jackson-databind-2.3.4.jar

何か不足していますか?例外は、SockJsMessageCodec が利用できなかったことを示しています..

事前に誰か助けてください..

ところで、これは私がフォローしたデモです。https://gerrydevstory.com/2014/03/04/stock-ticker-demo-webapp-using-spring-4-websocket/

4

3 に答える 3

7

jackson-databind のみを追加:

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.5.3</version>
        <scope>runtime</scope>
    </dependency>

私のために働いた。

于 2015-06-08T16:43:05.020 に答える
5

こんにちは、私は自分の問題の解決策を見つけました...

2 つの jar ファイルを追加しました。

jackson-annotations-2.4.3.jar
jackson-core-2.4.3.jar

そしてそれは今働いています...

Opening Web Socket...         stomp.js:145
Web Socket Opened...          stomp.js:145
>>> CONNECT
accept-version:1.1,1.0
heart-beat:10000,10000        stomp.js:145

<<< CONNECTED
version:1.1
heart-beat:0,0                stomp.js:145

connected to server undefined stomp.js:145
>>> SUBSCRIBE
id:sub-0
destination:/topic/lobby
于 2014-11-18T08:10:32.587 に答える
3

コミュニティの更新のみです。次の依存関係を追加することで、Maven Web アプリケーションでこの問題を修正しました。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.0</version>
</dependency>
于 2015-01-16T20:26:10.413 に答える