前言

  三代项目中有一个LogicList来装所有的结果什么什么的,直接继承ArrayList,同时还有一个属性currentRowNumber来记录当前索引,这样的话遍历啊,表达式获取都比较方便,但是使用ObjectMapperconvertValue的时候就会出现问题。每个LogicList都被转成了ArrayList,导致后面的一些操作就会报错,类型不一致

解决

  通过查看ObjectMapper的配置,发现有一个方法addAbstractTypeMapping,于是new一个SimpleModulemodule.addAbstractTypeMapping(List.class, LogicList.class);
回去重试发现已经解决问题。因为项目中没有ArrayList,只有跟LogicList,所以可以放心映射
完整代码:

@Bean
    public Jackson2ObjectMapperBuilderCustomizer customJackson(Collection<Module> moduleBeans) {
        return jacksonObjectMapperBuilder -> {
            JavaTimeModule javaTimeModule = new JavaTimeModule();
            javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
            javaTimeModule.addDeserializer(LocalDateTime.class, new JsonDeserializer<>() {
                @Override
                public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
                    String valueAsString = p.getValueAsString();
                    if (Pattern.matches("\\d{4}-\\d{2}-\\d{2}", valueAsString)) {
                        valueAsString += " 00:00:00";
                    }
                    return LocalDateTime.parse(valueAsString, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
                }
            });
            javaTimeModule.addSerializer(BigDecimal.class, new JsonSerializer<>() {
                @Override
                public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                    gen.writeString(value.toString());
                }
            });
            SimpleModule module = new SimpleModule("LogicListSerializer", Version.unknownVersion());
            module.addAbstractTypeMapping(List.class, LogicList.class);
            List<Module> modules = new ArrayList<>(moduleBeans);
            modules.add(javaTimeModule);
            modules.add(module);
            jacksonObjectMapperBuilder.modulesToInstall(modules.toArray(new Module[0]));
        };
    }

子类待补 registerSubtypes