Heim  >  Artikel  >  Datenbank  >  So lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBoot

So lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBoot

王林
王林nach vorne
2023-05-27 11:34:061867Durchsuche

Verstümmelter Redis-Serialisierungscode unter SpringBoot

Die ursprüngliche Serialisierungslösung des Projekts verwendete die JDK-Serialisierungsklasse, aber das Speichern in Redis führt zu verstümmeltem Code, der unpraktisch anzuzeigen und zu verwalten ist.

public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
        redisTemplate.setKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader()));
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader()));
        redisTemplate.setHashKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader()));
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader()));
        this.redisTemplate = redisTemplate;
    }

Nach der Online-Überprüfung liegt es am Serialisierungsklassenproblem. Wir verwenden nicht die Serialisierungsmethode von JDK und verwenden das JSON-Format

public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
        this.redisTemplate = redisTemplate;
    }

Achtung für das Problem

#🎜🎜 #Bei Verwendung des oben genannten Serialisierers muss sichergestellt werden, dass alle Get-Methoden in der Entitätsklasse über Attributfelder verfügen. Andernfalls treten bei der Deserialisierung Probleme auf. Wenn die Annotation @JsonIgnore nicht hinzugefügt werden muss, wird sie ignoriert während der Serialisierung.

SpringBoot konfiguriert Redis-Serialisierungsregeln, um verstümmelte Zeichen zu verhindern

SpringBoot ist sehr einfach, Redis einzuführen. Fügen Sie die folgende Anmerkung hinzu:

#🎜🎜 #So lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBootFügen Sie dann die Redis-Konfiguration in application.yml hinzu:

So lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBootHinweis: Hier gibt es einige zusätzliche Konfigurationen, z. B. das Passwort usw. Ich werde es hier nicht aufschreiben, um Ärger zu vermeiden.

Jetzt können wir die Testklasse schreiben

So lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBootNach dem Testen haben wir ein Problem wie test:1 festgestellt . . Als ich zum Beispiel das Tool

Another.Redis.Desktop.Manager zum Anzeigen verwendete, stellte ich fest, dass es sich in eine Reihe seltsamer Zeichenfolgen verwandelte.

ist verstümmelt.

Dies wird durch die Standard-Serialisierungsregeln von Redis verursacht. Alle Standard-Serialisierungsregeln von RedisTemplate sind JDKSerializer, und die Standard-Serialisierungsregeln von StringRedisTemplate sind StringRedisSerializer.

Details finden Sie im Bild unten.

So lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBoot

So lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBootWir brauchen um es zu tun Konfiguration

package com.eknown.config; 
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
 
/**
 * redis配置
 * 主要是配置Redis的序列化规则,用Jackson2JsonRedisSerializer替换默认的jdkSerializer
 * @author zhangfanghao
 * @version 1.0
 * @date 2019-07-21 21:04
 */
@Configuration
public class RedisConfig { 
 
    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
 
        // 使用Jackson2JsonRedisSerialize替换默认序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
 
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
 
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
 
        // 设置key和value的序列化规则
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.afterPropertiesSet(); 
        return redisTemplate;
    }
}

Hinweis: Hier werden nur die Serialisierungsregeln von Schlüssel und Wert zurückgesetzt. Die Serialisierungsregeln von Hash-Schlüssel und Hash-Wert können als Referenz festgelegt werden.

Das obige ist der detaillierte Inhalt vonSo lösen Sie verstümmelten Redis-Serialisierungscode unter SpringBoot. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen