`

Spring4.0.6 Websocket详细配置 之 遇到问题

阅读更多

基于SpringMVC做Websocket开发过程遇到一系列问题:

 

问题1:统计了一下大家遇到第一个问题就是连接websocket时候报404错误

先检查连接websocket的url格式:ws://localhost:8080/test/webSocketServer.do,这个.do后缀要匹配SpringMVC拦截后缀

 

其次检查下Spring配置文件是否有加这个tag:<mvc:annotation-driven/>(加这个会出现中文乱码,下面会讲到),使用Spring websocket需要这个tag支持

当Spring配置文件有使用<context:component-scan/>扫描包,这个tag<context:annotation-config/>可以不去掉。

 

问题2:连接websocket时候报200,说明已经进入拦截器握手成功,但是没连接上websocket

首先,这个主要原因是在自己的代码上,如果websocket有配置自己定义的拦截器,先检查下拦截器beforeHandshake这个方法,这个方法有个参数Map<String, Object> attributes,不能给这个map的value设成null,否则进不到自己Handler下的这个方法afterConnectionEstablished,就会报200其次,在自定义websocket的Handler和拦截器,加上@Component注解(这个是可选部分,根据自己环境来做选择,基本上可以拔除这个原因,仅做参考)
问题3:连接websocket时候,如果缺少配置会报415 Unsupported Media Type请求的格式不受请求页面的支持错误

当用户发送请求后,@Requestbody 注解会读取请求body中的数据,默认的请求转换器HttpMessageConverter通过获取请求头Header中的Content-Type来 确认请求头的数据格式,从而来为请求数据适配合适的转换器。例如contentType:applicatin/json,那么转换器会适配 MappingJacksonHttpMessageConverter。响应时候的时候同理,@Responsebody注解会启用 HttpMessageConverter,通过检测Header中Accept属性来适配的响应的转换器。

当在使用SpringMVC做服务器数据接收时,尤其是在做Ajax请求的时候,尤其要注意contentType属性,和accepte 属性的设置,在springmvc-config.xml中配置好相应的转换器。

添加相应转换器:

<bean id="stringHttpMessageConverter"
        class="org.springframework.http.converter.StringHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/plain;charset=UTF-8</value>
            </list>
        </property>
</bean>

<bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="stringHttpMessageConverter" />新增的
                <ref bean="byteArrayHttpMessageConverter" />
                <ref bean="jsonHttpMessageConverter" />
                <ref bean="jsonHttpMessageConverter4JS" />
            </list>
        </property>
    </bean>

可以参考这个文章:http://www.2cto.com/kf/201312/262557.html
问题4:网上例子都有说要在web.xml下的servlet和filter里面加上<async-supported>true</async-supported>我试下没有影响websocket是可以连接成功的,可以不用加,这个是用来支持异步的servlet3.x,建议不用加,除非有用到这个特性
问题5:添加<mvc:annotation-driven/>这个出现中文乱码
刚开始时候,所有浏览器都出现中文乱码,后来解决在Chrome浏览不会出现中文乱码,但是在FF下会出现。原因有三个:
第一,MessageConverter转换器没配置相应的<property name="supportedMediaTypes">属性,
第二,bean和tag的先后顺序不对,
第三,当使用<mvc:annotation-driven/>这个tag时候,请求处理器就会变成RequestMappingHandlerAdapter,跟进代码就会发现不是采用AnnotationMethodHandlerAdapter,所以配置时候要改成:org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
统一解决办法是:要注意bean和tag的先后顺序
<bean
        class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">//这是根本原因
        <property name="messageConverters">
            <list>
                <ref bean="stringHttpMessageConverter" />
                <ref bean="byteArrayHttpMessageConverter" />
                <ref bean="jsonHttpMessageConverter" />
                <ref bean="jsonHttpMessageConverter4JS" />
            </list>
        </property>
    </bean>
<context:component-scan base-package="扫描Spring controller包路径" />
<context:component-scan base-package="扫描websocket包路径"/>
<context:annotation-config />  //这个标注可以不加
<mvc:annotation-driven/>//这个tag一定要放在上面代码最后,这是也是乱码根源之一

这块具体的配置可以参考我上一篇文章第4点:http://strongant.iteye.com/admin/blogs/2153820

 

问题6:websocket相关js代码放在html上可以连接到websocket后端,放在jsp上就连接不成功

如果项目有配置yuicompressor-2.4.7.jar,就要注意了这个问题跟项目环境有关,主要是检查项目web.xml配置,项目里面web.xml配置对jsp,css,do做了自动优化(使用yuicompressor-2.4.7.jar),自动优化会把jsp输出优化成无格式,主要用于传输速度变快,但是变成无格式后websocket相关脚本就出现运行不了,最后把这块jsp自动优化去掉

 

问题7:js上onopen和onmessage会同时触发

当第一次连接到websocket后台,会触发Handler下的afterConnectionEstablished这个方法发送消息,如果在这个方法有发送消息给自己,在UI上会同时触发onopen和onmessage方法,这个不知道为什么会触发onmessage方法,从websocket上协议讲,只会触发onopen方法!!!

 

问题8:返回jsp时候,路径出现重复名字导致找不到jsp页面(这个大家估计不会遇到,跟项目配置有关)

比如:正常要返回路径localhost:8080/test/template/js/list.jsp

变成错误路径:localhost:8080/test/template/template/js/list.jsp(多了一个template),后来发现是我的视图解释图配置有点问题

<bean id="viewResolvers"
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="cache" value="true" />
        <property name="prefix" value="" />
        <property name="suffix" value=".jsp" />
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="contentType">
            <value>text/html; charset=UTF-8</value>
        </property>
</bean>

改成下面这个配置解决这个问题

<bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/" />
        <property name="suffix" value=".jsp" />
</bean>

 

问题9:启动时候出现这个Factory method 'webSocketHandlerMapping' threw exception; nested exception is java.lang.IllegalStateException: No suitable default RequestUpgradeStrategy found

 

说明你的容器不支持websocket协议Tomcat7,0.26之后才支持websocket

Jboss as 7不支持websocket,需要要安装插件,可以直接升级到wildfly8支持websocket

分享到:
评论

相关推荐

    spring4.0.6+mybatis3.2.7整合比用包

    本文将详细解析"spring4.0.6+mybatis3.2.7整合包"的整合过程及其相关知识点。 首先,Spring 4.0.6是Spring框架的一个稳定版本,它提供了强大的依赖注入(DI)和面向切面编程(AOP)功能,使得开发者能够更好地管理...

    Spring4WebSocketDemo

    自己参考了官方的Spring4集成WebSocket的Demo。编写的一个Spring4集成WebSocket的例子(no-maven).环境Eclipse(indigo)+jdk7+tomcat7+Spring4.0.6+SpringMVC. 希望对初次接触WebSocket的同学有所帮助。

    spring-framework-4.0.6.RELEASE

    4. **WebSocket支持**:为了适应实时通信的需求,Spring 4.0.6.RELEASE集成了WebSocket API,允许开发者创建基于WebSocket的应用,实现双向通信。 5. **反应式编程**:Spring 4.0.6.RELEASE开始引入对反应式编程的...

    spring-framework-4.0.6.RELEASE jar包

    4.0.6.RELEASE 版本是 Spring 的一个重要里程碑,它在之前版本的基础上进行了多方面的改进和增强,为开发者带来了更稳定、更高效的功能。 Spring 框架的核心特性包括依赖注入(Dependency Injection,DI)、面向切...

    spring-framework-4.0.6.RELEASE 源码

    本篇文章将详细探讨Spring Framework 4.0.6.RELEASE版本的源码,帮助开发者更好地理解和运用这一版本的核心功能。 1. **模块架构** Spring Framework 4.0.6由多个模块组成,包括Core Container(核心容器)、Data ...

    websocket jar包

    websocket jar包,spring-messaging-4.0.6.RELEASE,spring-websocket-4.0.6.RELEASE,tomcat7-websocket,websocket-api

    SpringMvc 4.0.6

    在 Spring MVC 4.0.6 版本中,我们能看到一系列增强特性和优化,使其成为企业级应用开发的首选工具之一。 首先,让我们深入理解 Spring MVC 的核心概念: 1. **DispatcherServlet**:作为 Spring MVC 应用的前端...

    Spring和Websocket相结合实现消息的推送

    本文将详细介绍如何利用Spring 4.0.6及以上版本和WebSocket技术来构建一个消息推送系统。\n\n首先,我们需要了解WebSocket的基本概念。WebSocket是一种在客户端和服务器之间建立长连接的协议,允许双方进行全双工...

    spring-framework-4.1.6.RELEASE-dist.zip

    以下是对Spring Framework 4.1.6.RELEASE的一些关键知识点的详细说明: 1. **依赖管理**: Spring 4.1.6.RELEASE包含了一套完整的依赖管理系统,它规定了与其他库(如Hibernate、MyBatis等)集成时的最佳版本,...

    spring4源码

    Spring 4.0.6引入了大量的注解,如@Service、@Repository、@Controller等,使得开发者能更加方便地进行无XML配置的开发。 7. **性能优化** 在这个版本中,Spring对性能进行了优化,包括更快的启动时间、更高效的...

    java8源码-ffmpeg-web-pusher:基于FFmpeg、SpringBoot、JavaCV开发的远程推流服务,可通过http-a

    4.0.6 VERSION: GLIBC : 2.29 特性 通过SpringBoot提供 Restful API 使用Java线程池技术,支持并发推流 使用,相比直接调用ffmpeg命令行,更加灵活,支持更多的定制。 容器化部署,简化部署流程 使用 1. 容器部署 ...

Global site tag (gtag.js) - Google Analytics