2015-06-24 83 views
0
  1. 我編寫基於Spring MVC的簡單Web應用程序。 Everything run Ok。然後我創建EndpointHandShake類到Terminal (C# Application)通過Websocket與服務器通信。Spring 4 WebSocket集成到Spring MVC應用程序

    • WebsocketEndPoint.java

      public class WebsocketEndPoint extends BinaryWebSocketHandler { 
      
          @Override 
          public void afterConnectionEstablished(WebSocketSession session) throws Exception { 
           System.out.println("After Connection Established !!!!"); 
          } 
      
          @Override 
          protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws Exception { 
           session.sendMessage(message); 
          } 
      
          @Override 
          public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { 
           System.out.println("After Connection Closed !!!!"); 
          } 
      
      } 
      
    • HandshakeInterceptor.java

      public class HandshakeInterceptor extends HttpSessionHandshakeInterceptor{ 
      
          @Override 
          public boolean beforeHandshake(ServerHttpRequest request, 
           ServerHttpResponse response, WebSocketHandler wsHandler, 
      Map<String, Object> attributes) throws Exception { 
           System.out.println("Before Handshake"); 
           return super.beforeHandshake(request, response, wsHandler, attributes); 
          } 
      
          @Override 
          public void afterHandshake(ServerHttpRequest request, 
      ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) { 
           System.out.println("After Handshake"); 
           super.afterHandshake(request, response, wsHandler, ex); 
          } 
      } 
      
    • XML配置的WebSocket處理器和攔截:websocketconfig.xml

      <beans xmlns="http://www.springframework.org/schema/beans" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xmlns:websocket="http://www.springframework.org/schema/websocket" 
          xsi:schemaLocation=" 
           http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans.xsd 
           http://www.springframework.org/schema/websocket 
           http://www.springframework.org/schema/websocket/spring-websocket.xsd"> 
      
           <bean id="websocket" class="com.javahash.spring.WebsocketEndPoint"/> 
      
           <websocket:handlers> 
            <websocket:mapping path="/PaymentHandler" handler="websocket"/> 
            <websocket:handshake-interceptors> 
            <bean class="com.javahash.spring.HandshakeInterceptor"/> 
            </websocket:handshake-interceptors> 
           </websocket:handlers> 
      </beans> 
      
  2. 添加websocketconfig.xml到Spring應用程序上下文

    • web.xml中

      <web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
          version="2.4"> 
      
          <display-name>Web server</display-name> 
      
          <servlet> 
           <servlet-name>webserver</servlet-name> 
           <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
           <load-on-startup>1</load-on-startup> 
          </servlet> 
      
          <servlet-mapping> 
           <servlet-name>dispatcher</servlet-name> 
           <url-pattern>/</url-pattern> 
          </servlet-mapping> 
      
          <context-param> 
           <param-name>contextConfigLocation</param-name> 
           <param-value> 
            /WEB-INF/dispatcher-servlet.xml 
            /WEB-INF/websocketconf.xml 
           </param-value> 
          </context-param> 
      
          <listener> 
           <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
          </listener> 
      </web-app> 
      
  3. 加入websocketconfig.xml到Spring應用程序上下文後:

    • 終端(C#應用程序)can communicate with Server via Socket但我can not access web
    • WARNING: No mapping found for HTTP request with URI [Spring4MVCHelloWorld/hello]] in DispatcherServlet with name 'dispatcher'
    • 調度-servlet.xml中

      <beans xmlns="http://www.springframework.org/schema/beans" 
      xmlns:context="http://www.springframework.org/schema/context" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-4.0.xsd"> 
      
          <context:component-scan base-package="com.javahash.spring.controller" /> 
      
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
           <property name="prefix"> 
            <value>/WEB-INF/views/</value> 
           </property> 
           <property name="suffix"> 
            <value>.jsp</value> 
           </property> 
          </bean> 
      </beans> 
      
    • HelloWorldController.java

      package com.javahash.spring.controller; 
      
      import org.springframework.stereotype.Controller; 
      import org.springframework.ui.Model; 
      import org.springframework.web.bind.annotation.RequestMapping; 
      import org.springframework.web.bind.annotation.RequestParam; 
      
      @Controller 
      public class HelloWorldController { 
      
          @RequestMapping("/hello") 
          public String hello(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) { 
           model.addAttribute("name", name); 
           return "helloworld"; 
          } 
      
      } 
      
    • 看來@Controller not effect

我是否錯過了什麼?

回答

1

我想你在你的dispatcher-servlet.xml文件中缺少<mvc:annotation-driven/>。 Spring掃描你的Controller bean,但Spring MVC沒有註冊你的映射。