Files
TimiServerAPI/src/main/java/com/imyeyu/api/util/GsonSerializerAdapter.java
2025-11-06 14:52:13 +08:00

61 lines
1.8 KiB
Java

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<Object> {
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 <K extends MultilingualHandler> void fillMultilingual(K value) {
try {
List<Field> 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);
}
}
}