SpringBoot - 从Jackson2转换到Jackson3 - 缺少类型标识属性 '@class'
我有一个项目,曾经使用 SpringBoot 3.3.0,并且依赖Jackson2。 在我切换为 SpringBoot 4.0.2,并使用Jackson3依赖后,代码就无法工作了。
Jackson2:
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
@Bean
public RedisSerializer<Object> jackson2JsonRedisSerializer() {
ObjectMapper objectMapper = getObjectMapper();
return new GenericJackson2JsonRedisSerializer(objectMapper);
}
private ObjectMapper getObjectMapper() {
var objectMapper = new ObjectMapper();
var defaultTypeResolver = ObjectMapper.DefaultTypeResolverBuilder.construct(
ObjectMapper.DefaultTyping.EVERYTHING,
objectMapper.getPolymorphicTypeValidator()
);
objectMapper.registerModule(new JavaTimeModule());
defaultTypeResolver.init(JsonTypeInfo.Id.CLASS, null);
defaultTypeResolver.inclusion(JsonTypeInfo.As.PROPERTY);
objectMapper.setDefaultTyping(defaultTypeResolver);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
return objectMapper;
}
Jackson3:
import tools.jackson.databind.DefaultTyping;
import tools.jackson.databind.DeserializationFeature;
import tools.jackson.databind.ObjectMapper;
import tools.jackson.databind.json.JsonMapper;
import tools.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import tools.jackson.databind.jsontype.PolymorphicTypeValidator;
import org.springframework.data.redis.serializer.JacksonJsonRedisSerializer;
...java
@Bean
public RedisSerializer<Object> jackson2JsonRedisSerializer() {
ObjectMapper objectMapper = getObjectMapper();
return new JacksonJsonRedisSerializer<Object>(objectMapper, Object.class);
}
private ObjectMapper getObjectMapper() {
PolymorphicTypeValidator ptv = BasicPolymorphicTypeValidator.builder()
.allowIfBaseType(Object.class)
.build();
return JsonMapper.builder()
.activateDefaultTyping(ptv, DefaultTyping.NON_CONCRETE_AND_ARRAYS, JsonTypeInfo.As.PROPERTY)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.build();
}
我在Jackson3中找不到Jackson2的相同属性。现在我收到一个错误:
**org.springframework.data.redis.serializer.SerializationException:
Could not read JSON:Could not resolve subtype of \[simple type,
class java.lang.Object\]: missing type id property '@class'**
**at \[Source: REDACTED (\`StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION\` disabled); byte offset: #6046\]**
解决方案
我找到了与Jackson2最为相近的解决方案:
@Bean
public RedisSerializer<Object> jackson2JsonRedisSerializer() {
ObjectMapper objectMapper = getObjectMapper();
return new JacksonJsonRedisSerializer<>(objectMapper, Object.class);
}
private ObjectMapper getObjectMapper() {
return JsonMapper.builder()
.activateDefaultTyping(createPolymorphicTypeValidator(), DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.build();
}
private PolymorphicTypeValidator createPolymorphicTypeValidator() {
return BasicPolymorphicTypeValidator.builder()
.allowIfBaseType(Object.class)
.build();
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。