Java 在Spring会话JDBC中使用JSON格式
当您使用spring会话jdbc时,会话在DB中被序列化为字节,这意味着您必须在每次将spring升级到具有不兼容session.SerialVersionUID的版本时删除所有会话 我想将会话存储为JSON格式,但在谷歌搜索之后,似乎从来没有人这样做过 <>这是奇怪的,当您认为使用JSON存储RISIS中的会话是常见的做法。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,但当涉及到反序列化时,您永远无法
为什么没有一种标准的方法以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字符串,并在反序列化步骤中反序列化为该类型。
希望这能有所帮助