环境:Spring Boot\Mybatis-Plus\Jackson Ime 的实体:
package cn.bukkit.sip.orm.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "img", resultMap = "BaseResultMap")
public class ImgEntity implements Serializable {
@TableId(value = "id", type = IdType.ASSIGN_ID)
@JsonSerialize(using = ToStringSerializer.class)
private Long id;
@TableField(value = "name")
private String name;
@TableField(value = "path")
private String path;
@TableField(value = "size")
private Integer size;
@Builder.Default
@TableField(value = "public")
private Boolean isPublic = true;
@TableField(value = "limit_date")
private LocalDateTime dateLimit;
@TableField(value = "limit_times")
private Integer timesLimit;
@TableField(value = "owner")
private String owner;
@Builder.Default
@TableLogic
@TableField(value = "deleted")
@JsonIgnore
private Boolean isDeleted = false;
@JsonIgnore
@TableField(exist = false)
final private UserEntity userEntity = null;
}
我配置了对象映射器的bean
@Bean
ObjectMapper objectMapper() {
return JsonMapper.builder()
.addModule(new JavaTimeModule())
.build();
}
但是当我读取记录并读取 json 时,例外:
Could not write JSON: Type id handling not implemented for type java.lang.Object (by serializer of type com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer) (through reference chain: cn.bukkit.sip.orm.entity.ImgEntity[\"dateLimit\"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: **Type id handling not implemented for type java.lang.Object** (by serializer of type com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer) (through reference chain: cn.bukkit.sip.orm.entity.ImgEntity[\"dateLimit\"])
为什么
未针对 java.lang.Object 类型实现类型 id 处理
我想我已经配置了 JavaTimeModule
我可以通过使用启用它
@JsonSerialize(using = LocalDateTimeSerializer.class)
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8", shape = JsonFormat.Shape.STRING)
但我想在全球范围内进行
我已经尝试过
Jackson2ObjectMapperBuilderCustomizer
什么都没发生!
结果:我发现是redis缓存问题, 代码:
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
om.registerModules(new JavaTimeModule());
jackson2JsonRedisSerializer.setObjectMapper(om);
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ZERO)
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
我通过使用解决了这个问题
SerializationFeature.WRITE_DATES_AS_TIMESTAMPS
所以,尝试将杰克逊映射器更改为此:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule());
mapper.disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);