`
m635674608
  • 浏览: 5041052 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

spring session序列化问题排查

 
阅读更多
严重: Servlet.service() for servlet [spring] in context with path [/] threw exception
org.springframework.data.redis.serializer.SerializationException: Cannot serialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.mogoroom.service.vo.criteria.QueryBSPromotionListVO]
	at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:52)
	at org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:146)
	at org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:128)
	at org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:85)
	at org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.saveDelta(RedisOperationsSessionRepository.java:778)
	at org.springframework.session.data.redis.RedisOperationsSessionRepository$RedisSession.access$000(RedisOperationsSessionRepository.java:670)
	at org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:388)
	at org.springframework.session.data.redis.RedisOperationsSessionRepository.save(RedisOperationsSessionRepository.java:245)
	at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:245)
	at org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:217)
	at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:170)
	at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	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)
Caused by: org.springframework.core.serializer.support.SerializationFailedException: Failed to serialize object using DefaultSerializer; nested exception is java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.mogoroom.service.vo.criteria.QueryBSPromotionListVO]
	at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:67)
	at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:34)
	at org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:50)
	... 29 more
Caused by: java.lang.IllegalArgumentException: DefaultSerializer requires a Serializable payload but received an object of type [com.mogoroom.service.vo.criteria.QueryBSPromotionListVO]
	at org.springframework.core.serializer.DefaultSerializer.serialize(DefaultSerializer.java:41)
	at org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:62)
	... 31 more

	
问题:spring session 异常信息没有打印到日志中
用是默认jdk序列化。由于实体没有序列话,导致异常,但是没有输入到日志,导致定位到问题。

在代码中 request.getSession().setAttribute()是不会出现异常的
spring session 一次请求返回的时候,才会commit,才会触发spring session提交。
代码如下:onResponseCommitted
	
	/**
	 * Allows ensuring that the session is saved if the response is committed.
	 *
	 * @author Rob Winch
	 * @since 1.0
	 */
	private final class SessionRepositoryResponseWrapper
			extends OnCommittedResponseWrapper {

		private final SessionRepositoryRequestWrapper request;

		/**
		 * Create a new {@link SessionRepositoryResponseWrapper}.
		 * @param request the request to be wrapped
		 * @param response the response to be wrapped
		 */
		SessionRepositoryResponseWrapper(SessionRepositoryRequestWrapper request,
				HttpServletResponse response) {
			super(response);
			if (request == null) {
				throw new IllegalArgumentException("request cannot be null");
			}
			this.request = request;
		}

		@Override
		protected void onResponseCommitted() {
			this.request.commitSession();
		}
	}
	
	
OnCommittedResponseWrapper
	
abstract class OnCommittedResponseWrapper extends HttpServletResponseWrapper {
	
		/**
	 * Calls <code>onResponseCommmitted()</code> with the current contents as long as
	 * {@link #disableOnResponseCommitted()} was not invoked.
	 */
	private void doOnResponseCommitted() {
		if (!this.disableOnCommitted) {
			onResponseCommitted();
			disableOnResponseCommitted();
		}
	}
	
}	

doOnResponseCommitted相关依赖出发方法

 

 

解决方法:

filter抓下日志

chain.doFilter(wrappedRequest, response);

 

}catch (Exception ex){

logger.error("xxf",ex);

}

  • 大小: 23.1 KB
分享到:
评论

相关推荐

    spring cloud feign方式使用服务

    Feign默认使用Jackson作为JSON序列化库,也可以自定义编码器和解码器,如使用Gson或Fastjson。 四、Feign与Ribbon和Hystrix的集成 4.1 Ribbon集成 Feign默认集成了Ribbon,提供了负载均衡功能。通过Ribbon,Feign...

    使用springcloud 搭建微服务 (讲义)

    在应用层面,需要了解连接复用、序列化/反序列化、RPC以及负载均衡等技术。 Spring Cloud与Dubbo的区别在于,Spring Cloud使用Spring Boot作为基础框架,并集成了多种分布式系统处理方案,如服务注册与发现(Eureka...

    springMVC+hibernate+spring4.3 jar包整合

    7. 使用Jackson库进行JSON序列化与反序列化:在需要的地方引入Jackson库,通过 ObjectMapper 进行对象与JSON字符串的转换。 8. 处理文件上传:如果需要支持文件上传,可以使用Commons FileUpload库,结合Spring MVC...

    spring-jms源码

    这涉及到MessageConverter的实现,如SimpleMessageConverter或Jackson2JsonMessageConverter,它们负责对象与JMS消息之间的序列化和反序列化。 2. 事务管理:Spring JMS如何利用JMS的事务特性来保证消息的一致性。...

    SpringRedisSession

    - **序列化与反序列化**:可以根据需求选择合适的序列化方式,如JSON或Java原生序列化。 6. **性能优化** - **Redis事务**:利用Redis的事务特性,批量操作Session数据,提高效率。 - **连接池**:配置Redis连接...

    tomcat集群部署

    1. **基于文件的session复制**:将session信息序列化到文件,然后在集群中同步。 2. **基于内存的session复制**:使用TCP或JGroups等协议,在节点之间直接交换session数据。 3. **使用应用级解决方案**:如Spring ...

    java面试题目汇集

    6. **通信机制**:Stub和Skeleton之间的通信通常是基于TCP/IP的Socket连接,通过ObjectOutputStream和ObjectInputStream进行对象的序列化和反序列化,以便在网络中传输。 7. **异常处理**:如果在调用过程中发生...

    web开发注意事项(二).docx

    10. **环境适应性**:编码时要考虑部署环境的差异,比如不同操作系统下的路径问题、服务器间的时间同步问题,以及在多服务器环境下Session对象的序列化需求。 这些注意事项是Web开发中常见的实践,遵循它们可以显著...

    s2sh所需jar包

    6. Jackson或Gson:JSON序列化库,用于处理JSON格式的数据交换。 描述中提到的“亲测可用”,意味着这些jar包是经过验证的,可以在实际的S2SH项目中正常运行。在使用这些jar包搭建项目时,通常需要配置相关的XML...

    阿里45K高级Java岗,必备技能清单来了! (2).pdf

    理解网络编程、序列化机制以及JVM的工作原理,能帮助编写出高效且安全的多线程程序。同时,对Tomcat、Nginx等服务器的深入理解也是必不可少的。 2. **设计模式**:设计模式是软件工程中的最佳实践,如工厂模式、...

    java笔试面试题(含有笔试题,核心技术,重点知识,struts,hibernate,spring,eclipse)

    - **常见错误解决**:例如启动失败、端口冲突等问题的排查与解决方法。 以上内容涵盖了Java笔试面试题中提到的核心技术和重点知识,对于准备Java相关职位的面试者而言非常实用。理解并掌握这些知识点不仅有助于面试...

    第一节课,用户管理-后端测试通过

    Java的Spring Boot框架提供了方便的API设计和JSON序列化/反序列化支持。 7. **单元测试与集成测试(Unit Testing & Integration Testing)**:确保用户管理功能的正确性,需要编写测试用例。JUnit是常用的Java单元...

    ajax+dwr整合

    它提供了自动序列化和反序列化、错误处理等功能。DWR的工作原理如下: 1. 在服务器端,DWR生成一组JavaScript代码,这些代码提供了调用Java方法的接口。 2. 客户端通过HTML或JavaScript引入这些自动生成的...

    java,ssh,数据库面试题整理

    - **IO流**:字节流、字符流、缓冲流、对象序列化、文件操作。 - **反射**:类加载、获取类信息、创建对象、调用方法。 - **设计模式**:单例、工厂、观察者、装饰者、适配器等常见设计模式的应用。 2. **SSH...

    Axis2(WebService)经典教程

    - **实现**:通过序列化和反序列化机制,将复杂的Java对象转换为XML或JSON格式进行传输。 ##### 3. 使用`services.xml`文件发布WebService - **作用**:定义WebService的基本配置信息,如服务名、端口等。 - **...

    J2EE架构师手册.rar

    8. **JAF(JavaBeans Activation Framework)** 和 **JAFR(JavaBeans Activation Framework for RMI)**:支持对不同类型的MIME数据进行操作和序列化,常用于电子邮件和Web服务。 9. **Web Services**:通过SOAP...

Global site tag (gtag.js) - Google Analytics