SpringBoot - 从Jackson2转换到Jackson3 - 缺少类型标识属性 '@class'

后端开发 2026-07-12

我有一个项目,曾经使用 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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章