package com.dl.common.translation.handler; import cn.hutool.core.util.ObjectUtil; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.dl.common.annotation.Translation; import com.dl.common.translation.TranslationInterface; import com.dl.common.utils.StringUtils; import com.dl.common.utils.reflect.ReflectUtils; import lombok.extern.slf4j.Slf4j; import java.io.IOException; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; /** * 翻译处理器 * * @author Lion Li */ @Slf4j public class TranslationHandler extends JsonSerializer implements ContextualSerializer { /** * 全局翻译实现类映射器 */ public static final Map> TRANSLATION_MAPPER = new ConcurrentHashMap<>(); private Translation translation; @Override public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { TranslationInterface trans = TRANSLATION_MAPPER.get(translation.type()); if (ObjectUtil.isNotNull(trans)) { // 如果映射字段不为空 则取映射字段的值 if (StringUtils.isNotBlank(translation.mapper())) { value = ReflectUtils.invokeGetter(gen.getCurrentValue(), translation.mapper()); } // 如果为 null 直接写出 if (ObjectUtil.isNull(value)) { gen.writeNull(); return; } Object result = trans.translation(value, translation.other()); gen.writeObject(result); } else { gen.writeObject(value); } } @Override public JsonSerializer createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException { Translation translation = property.getAnnotation(Translation.class); if (Objects.nonNull(translation)) { this.translation = translation; return this; } return prov.findValueSerializer(property.getType(), property); } }