JSON 的主要问题是对象类型:您可以轻松地将对象序列化为 JSON,但在反序列化时 - 您永远无法知道这个 JSON 代表什么类型的对象。
我也遇到过同样的问题。但对我来说,只解析来自外部源的会话的 JSON 数据部分就足够了。我的解决方案是创建org.springframework.core.convert.converter.Converter 接口的两个新实现——一个用于序列化(Object 到byte[]),一个用于反序列化(byte[] 到Object),然后将它们注册为Spring 的转换器。 org.springframework.session.jdbc.JdbcOperationsSessionRepository 使用此转换器来存储/读取会话属性字节。您可以像这样创建您的实现(使用 Jackson 库来处理 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;
}
}
JsonDeserializingConverter
@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;
}
}
除非您不需要将 JSON 数据与对象绑定(例如 CsrfToken 对象),否则它将正常工作。在这种情况下,您可能可以在序列化步骤中使用目标类型注释您的 JSON 字符串,并在反序列化步骤中反序列化为该类型。
希望这可能会有所帮助。