package com.imyeyu.api.util; import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializer; import com.imyeyu.java.TimiJava; import com.imyeyu.java.ref.Ref; import com.imyeyu.api.TimiServerAPI; import com.imyeyu.api.bean.MultilingualHandler; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.lang.reflect.Field; import java.lang.reflect.Type; import java.util.List; /** * @author 夜雨 * @version 2023-10-26 10:16 */ @Slf4j @Component @RequiredArgsConstructor public class GsonSerializerAdapter implements JsonSerializer { private final Gson gson; private final RedisMultilingual redisMultilingual; @Override public JsonElement serialize(Object value, Type typeOfSrc, JsonSerializationContext context) { if (value instanceof MultilingualHandler _value) { fillMultilingual(_value); } return gson.toJsonTree(value); } private void fillMultilingual(K value) { try { List fields = Ref.listFields(value.getClass()); for (int i = 0; i < fields.size(); i++) { Field field = fields.get(i); MultilingualHandler.MultilingualField multiField = field.getAnnotation(MultilingualHandler.MultilingualField.class); if (multiField != null) { String multiLangId = Ref.getFieldValue(value, field, String.class); if (TimiJava.isNotEmpty(multiLangId)) { Long langId = Long.parseLong(multiLangId); if (redisMultilingual.map(TimiServerAPI.getUserLanguage()) instanceof RedisLanguage rl) { // TODO 支持插值参数 Ref.setFieldValue(value, field, rl.text(langId)); } } } } } catch (IllegalAccessException e) { throw new RuntimeException(e); } } }