Java 在Spring会话JDBC中使用JSON格式

Java 在Spring会话JDBC中使用JSON格式,java,json,jdbc,spring-session,Java,Json,Jdbc,Spring Session,当您使用spring会话jdbc时,会话在DB中被序列化为字节,这意味着您必须在每次将spring升级到具有不兼容session.SerialVersionUID的版本时删除所有会话 我想将会话存储为JSON格式,但在谷歌搜索之后,似乎从来没有人这样做过 这是奇怪的,当您认为使用JSON存储RISIS中的会话是常见的做法。 为什么没有一种标准的方法以JSON格式在JDBC中存储会话?这是如何实现的?JSON的主要问题是对象类型:您可以轻松地将对象序列化为JSON,但当涉及到反序列化时,您永远无法

当您使用spring会话jdbc时,会话在DB中被序列化为字节,这意味着您必须在每次将spring升级到具有不兼容session.SerialVersionUID的版本时删除所有会话

我想将会话存储为JSON格式,但在谷歌搜索之后,似乎从来没有人这样做过

<>这是奇怪的,当您认为使用JSON存储RISIS中的会话是常见的做法。
为什么没有一种标准的方法以JSON格式在JDBC中存储会话?这是如何实现的?

JSON的主要问题是对象类型:您可以轻松地将对象序列化为JSON,但当涉及到反序列化时,您永远无法知道此JSON对应的对象类型

我也遇到过类似的问题。但对我来说,只解析JSON数据的一部分就足够了,这部分数据来自外部源。我的解决方案是创建两个新的
org.springframework.core.convert.converter.converter
接口实现——一个用于序列化(
Object
byte[]
),另一个用于反序列化(
byte[]
Object
),然后将它们注册为Spring的转换器。
org.springframework.session.jdbc.jdboperationsessionrepository
使用此转换器存储/读取会话属性字节。您可以这样创建实现(使用库来处理JSON):

JsonSerializingConverter

@Component
public class JsonSerializingConverter implements Converter<Object, byte[]> {
    @Override
    public byte[] convert(Object source) {
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.writeValueAsBytes(source);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
@Component
public class JsonDeserializingConverter implements Converter<byte[], Object> {
    @Override
    public Object convert(byte[] source) {
       ObjectMapper objectMapper = new ObjectMapper();
       try {
         return objectMapper.readValue(source, Object.class);
       } catch (IOException e) {
         e.printStackTrace();
       }
       return null;
    }
}
接下来,您应该注册它们:

@Configuration
public class ConversionServiceConfiguration
{
    @Bean
    public ConversionServiceFactoryBean conversionService()
    {
        ConversionServiceFactoryBean bean = new ConversionServiceFactoryBean();
        bean.setConverters(getConverters());

        return bean;
    }

    private Set<Converter> getConverters()
    {
        Set<Converter> converters = new HashSet<>();
        converters.add(new JsonDeserializingConverter());
        converters.add(new JsonSerializingConverter());

        return converters;
    }
}
@配置
公共类转换服务配置
{
@豆子
公共转换服务工厂bean转换服务()
{
ConversionServiceFactoryBean=新的ConversionServiceFactoryBean();
setConverters(getConverters());
返回豆;
}
私有集getConverters()
{
Set converters=新的HashSet();
添加(新的JsonDeserializingConverter());
添加(新的JsonSerializingConverter());
回流转换器;
}
}
除非您不需要将JSON数据与对象绑定(例如
CsrfToken
object),否则它可以正常工作。在这种情况下,您可能可以在序列化步骤中使用目标类型注释JSON字符串,并在反序列化步骤中反序列化为该类型。 希望这能有所帮助