为了尝试外部化我现有应用程序的tomcat会话,我正在尝试使用Spring Session Redis解决方案。按照步骤在pom.xml中包含必要的依赖项,如下所示:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>1.2.1.RELEASE</version>
</dependency>
在web.xml中添加springSessionRepositoryFilter,如下所示:
<filter>
<filter-name>springSessionRepositoryFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSessionRepositoryFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
并在Spring XML配置中添加以下内容
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<context:property-placeholder location="classpath:application.properties"/>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:port="${spring.redis.port}"/>
并构建和部署到tomcat,这是我得到的错误:
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.io.NotSerializableException: com.sun.jersey.client.apache.ApacheHttpClient
非常感谢任何建议或帮助。谢谢 !! 还附上了我的pom.xml条目: pom.xml entries
答案 0 :(得分:1)
从您的例外情况来看,com.sun.jersey.client.apache.ApacheHttpClient不可序列化,因为它没有实现java.io.Serializable。
您需要以其他方式序列化ApacheHttpClient ,因为它是第三方库。
您可以使用杰克逊图书馆中的org.codehaus.jackson.map.ObjectMapper
来实现此目标。
请参阅此example。
您也可以尝试使用HttpClient附带的SerializableEntity类。
httpost.setEntity(new SerializableEntity(mySerializableObj, false));
以下是使类可序列化的一般方法。
答案 1 :(得分:0)
这里只想说明一种可能的解决方案。为简洁起见,我假设您使用的是spring-boot。
实际上,当您使用RedisHttpSessionConfiguration
注释应用程序时,spring boot会自动配置@EnableRedisHttpSession
类中定义的bean。在自动配置的bean中,sessionRedisTemplate
是您想要自定义序列化程序的内容。下面的代码显示了RedisHttpSessionConfiguration
提供的默认bean定义。
@Bean
public RedisTemplate<Object, Object> sessionRedisTemplate(
RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
if (this.defaultRedisSerializer != null) {
template.setDefaultSerializer(this.defaultRedisSerializer);
}
template.setConnectionFactory(connectionFactory);
return template;
}
要覆盖此bean配置,只需在一个@Configuration类(例如,HttpSessionConfig)中声明一个名为sessionRedisTemplate
的bean,Spring-boot将完成覆盖其默认设置的魔力。在这里,我使用GenericJackson2JsonSerializer
进行演示。
@Configuration
public class HttpSessionConfig {
@Bean
public RedisTemplate<Object, Object> sessionRedisTemplate(
RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(connectionFactory);
return template;
}
}