序列化

1.配置类

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {

        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(Instant.class, new InstantCustomSerializer());
        javaTimeModule.addDeserializer(Instant.class, new InstantCustomDeserializer());
        javaTimeModule.addDeserializer(Integer.class, new IntegerCustomDeserializer());

        // 注册自定义的 DictSerializer
        SimpleModule customModule = new SimpleModule().setSerializerModifier(new DictSerializerModifierHelper());
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.registerModule(new ParameterNamesModule());
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.registerModule(javaTimeModule);
        objectMapper.registerModule(customModule);
        // 自定义日期转换格式
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        converters.add(0, new MappingJackson2HttpMessageConverter(objectMapper));
    }

    class InstantCustomSerializer extends JsonSerializer<Instant> {

        private DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;

        @Override
        public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
            if (instant != null) {
                String jsonValue = formatter.format(instant.atZone(ZoneId.systemDefault()));
                jsonGenerator.writeString(jsonValue);
            }
        }
    }

    class InstantCustomDeserializer extends JsonDeserializer<Instant> {
        private DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;

        @Override
        public Instant deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
            String dateString = jsonParser.getText().trim();
            if (StringUtils.isNotBlank(dateString)) {
                Date parseDate;
                try {
                    parseDate = DateFormatUtil.pareDate(dateString);
                    if (parseDate != parseDate) {
                        return parseDate.toInstant();
                    }
                } catch (ParseException e) {
                    throw new RuntimeException(e);
                }
            }
            return null;
        }
    }

    class IntegerCustomDeserializer extends JsonDeserializer<Integer> {
        @Override
        public Integer deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            //如果表单数据不为null,并满足指定格式时,进行类型转换
            String s = jsonParser.getText();
            if (StringUtils.isNotBlank(s)) {
                BigInteger sb = new BigInteger(s);
                if (sb.compareTo(new BigInteger(Integer.MAX_VALUE + "")) > 0) {
                    return 0;
                }
                if (s != null && s.matches("\\d+")) {
                    return Integer.parseInt(s);
                }
            }
            //当表单数据为空,或格式不合法时,则返回null
            return null;
        }
    }
}

2.初始化类

public class DictSerializerModifierHelper extends BeanSerializerModifier {

    @Override
    public JsonSerializer<?> modifySerializer(SerializationConfig config, BeanDescription beanDesc, JsonSerializer<?> serializer) {
        return new DictSerializer(null, null, null, (JsonSerializer<Object>) serializer);
    }

}

3.注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Dict {

    /**
     * 字典类型
     *
     * @return
     */
    String dictCode();

    /**
     * 返回属性名
     *
     * @return
     */
    String dictName() default "";
}

4.注入类

/**
 * 无法注入的问题
 */
@Component
public class DictHelper implements InitializingBean {

    @Resource
    private CafeEnumMapper dictMapper;

    public CafeEnumMapper getDictMapper() {
        return dictMapper;
    }

    private static DictHelper dictHelper;
    public static DictHelper init() {
        return dictHelper;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        dictHelper = this;
    }
}

5.核心

public class DictSerializer extends JsonSerializer<Object> implements ContextualSerializer {

    public final Logger logger = LoggerFactory.getLogger(getClass());

    // @Dict字典编码
    private String dictCode;

    // @Dict字典翻译后名称
    private String dictName;

    // 默认Serializer,从构造函数传入
    private JsonSerializer<Object> defSerializer;

    // 字典翻译label字段后缀
    private static final String DICT_NAME_SUFFIX = "Name";

    // 字典数据
    private Map<String, String> dictMap = null;

    public DictSerializer(String dictCode, String dictName, Map<String, String> dictMap, JsonSerializer<Object> jsonSerializer) {
        this.dictCode = dictCode;
        this.dictName = dictName;
        this.dictMap = dictMap;
        this.defSerializer = jsonSerializer;
    }

    /**
     * 获取添加@Dict字段,以及特殊处理Date类型字段
     */
    @Override
    public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
        // 经过BeanProperty获取自定义注解
        if (property == null) {
            return defSerializer;
        }
        //字典
        Dict dictAnnotation = property.getAnnotation(Dict.class);
        if (dictAnnotation != null) {
            LambdaQueryWrapper<CafeEnumEntity> queryWrapper = new LambdaQueryWrapper<CafeEnumEntity>()
                    .eq(CafeEnumEntity::getEnumkey, dictAnnotation.dictCode());
            // 构建key name的map
            Map<String, String> dictMap = DictHelper.init().getDictMapper().selectList(queryWrapper).stream().collect(Collectors.toMap(
                    CafeEnumEntity::getKey,
                    CafeEnumEntity::getName,
                    (o, n) -> n));
            dictMap.forEach((k, v) -> System.out.println("key:" + k + " value:" + v));
            return new DictSerializer(dictAnnotation.dictCode(), dictAnnotation.dictName(), dictMap, defSerializer);
        }
        //默认JsonSerializer
        return defSerializer;
    }

    @Override
    public void serialize(Object key, JsonGenerator gen, SerializerProvider serializers) throws IOException {
        defSerializer.serialize(key, gen, serializers);
        // 有自定义注解,如status字段 默认生成: statusName
        if (StringUtils.isNotBlank(dictCode) && key != null && StringUtils.isNotBlank(key.toString())) {
            //要翻译的字段名
            String fieldName = gen.getOutputContext().getCurrentName();
            //获取翻译后的lable
            String label = CollectionUtils.isEmpty(dictMap) ? null : dictMap.get(key.toString());
            //生成新的label字段
            gen.writeStringField(StringUtils.isBlank(dictName) ? fieldName.concat(DICT_NAME_SUFFIX) : dictName, label);
        }
    }
}
posted @ 2025-04-01 12:39  lwx_R  阅读(16)  评论(0)    收藏  举报