2016-07-22 8 views
1

In einem Versuch, Tomcat-Sitzung für meine vorhandene Anwendung zu externalisieren, versuche ich die Spring Session Redis-Lösung. Nachdem Sie die Schritte notwendig, Abhängigkeiten in pom.xml wie so enthalten:Spring Session Redis SerializerException

<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> 

die springSessionRepositoryFilter in web.xml wie folgt ergänzt:

<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> 

und die folgenden in Spring XML-Konfiguration

<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}"/> 

und Erstellen und Bereitstellen von auf tomcat, t ies ist der Fehler Ich erhalte:

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 

Jede Anregung oder Hilfe sehr geschätzt wird. Vielen Dank !! sind auch Einträge meine pom.xml angehängt: pom.xml entries

+0

können Sie die vollständige Stapelverfolgung der Ausnahme buchen? –

+0

'java.io.NotSerializableException' Ich rate, welches Objekt Sie speichern möchten, da ein Sitzungsstatus nicht serialisierbar ist. Veröffentlichen Sie weitere Details über die Mechanismen zum Speichern des Sitzungsstatus –

Antwort

1

Von Ihrer Ausnahme, com.sun.jersey.client.apache.ApacheHttpClient ist nicht serialisierbar, weil es java.io.Serializable nicht umgesetzt hat.

Sie benötigen ApacheHttpClient auf andere Weise serialisiert werden, weil es eine 3rd-Party-Bibliothek ist.

Sie können org.codehaus.jackson.map.ObjectMapper aus der Jackson-Bibliothek verwenden, um dies zu erreichen.

Bitte beziehen Sie sich auf diese example.

Sie können auch versuchen, SerializableEntity Klasse mit HttpClient ausgeliefert.

httpost.setEntity(new SerializableEntity(mySerializableObj, false)); 

Im Folgenden sind die allgemeinen Ansätze eine Klasse serialisierbar zu machen.

  • , wenn die Klasse dein ist, macht es Serializable (dies ist nicht Ihr Fall)
  • , wenn die Klasse ist 3rd-Party-, aber Sie brauchen es nicht in der serialisierten Form, markieren Sie die Feld als transiente
  • , wenn Sie ihre Daten benötigen und es dritten, andere Mittel zur Serialisierung betrachten, wie JSON, XML, BSON, Message usw. wo Sie 3rd-Party-Objekte serialisiert wit bekommen hout ändern ihre Definitionen.
+0

nach dem Versuch, Ihren Vorschlag, jetzt bekomme ich die folgenden Fehler/Ausnahmen ... Ich frage mich, ob ich in Kompatibilitätsprobleme mit Spring Session ... 'Code' org.springframework .data.redis.serializer.SerializationException: Serialisierung nicht möglich; verschachtelte Ausnahme ist org.springframework.core.serializer.support.SerializationFailedException: Fehler beim Serialisieren des Objekts mit DefaultSerializer; Die verschachtelte Ausnahme ist java.io.NotSerializableException: org.springframework.context.support.ReloadableResourceBundleMessageSource – joeflux

0

Ich möchte nur eine der möglichen Lösungen hier veranschaulichen. Der Kürze halber nehme ich an, dass Sie Spring-Boot verwenden.

Im Wesentlichen werden die in der Klasse RedisHttpSessionConfiguration definierten Beans beim Start automatisch konfiguriert, wenn Sie Ihre Anwendung mit @EnableRedisHttpSession annotieren.Und innerhalb der autokonfigurierten Beans ist sessionRedisTemplate, was Sie den Serializer anpassen möchten. Die folgenden Codes zeigen die Standard-Bean-Definition, die von RedisHttpSessionConfiguration bereitgestellt wird.

@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; 
} 

diese Bohne Config außer Kraft zu setzen, einfach declare eine Bohne sessionRedisTemplate in einem Ihrer @Configuration Klassen genannt (zum Beispiel HttpSessionConfig) und Spring-Boot Willen tut die Magie seiner Standardeinstellung außer Kraft zu setzen. Hier demonstriere ich es mit einem 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; 
} 
} 
Verwandte Themen