Gson序列化Firebase Admin SDK Message类时@Key注解不生效如何处理
问题根因
Firebase Admin SDK中Message类标注的@Key是谷歌API客户端工具包自带的自定义注解(全类名com.google.api.client.util.Key),既不是Gson默认识别的@SerializedName,也不是Jackson默认识别的@JsonProperty。你直接初始化的默认Gson、ObjectMapper实例没有配置对该注解的识别规则,因此序列化时直接读取字段名作为key,导致androidConfig字段没有被替换为预期的android。
解决方案
Gson 序列化解决方案
方案1:自定义Gson字段命名策略(推荐,侵入性最低)
给Gson实例配置自定义命名策略,主动识别@Key注解的值作为序列化key:
import com.google.api.client.util.Key; import com.google.gson.Gson; import com.google.gson.GsonBuilder; // 构建识别@Key注解的Gson实例 Gson gson = new GsonBuilder() .setFieldNamingStrategy(field -> { Key keyAnnotation = field.getAnnotation(Key.class); if (keyAnnotation != null) { return keyAnnotation.value(); } return field.getName(); }) .create(); // 序列化结果就会符合预期 String m = gson.toJson(message);
方案2:直接使用Firebase SDK自带的序列化工具
Firebase Admin SDK内部已经封装了适配@Key注解的序列化逻辑,不需要额外配置:
import com.google.api.client.json.JsonFactory; import com.google.firebase.internal.Utils; JsonFactory jsonFactory = Utils.getDefaultJsonFactory(); String m = jsonFactory.toString(message);
Jackson(ObjectMapper)序列化解决方案
自定义注解解析器,让Jackson识别@Key注解作为序列化key:
import com.fasterxml.jackson.databind.PropertyName; import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.google.api.client.util.Key; ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() { @Override public PropertyName findNameForSerialization(Annotated a) { Key key = a.getAnnotation(Key.class); if (key != null) { return PropertyName.construct(key.value()); } return super.findNameForSerialization(a); } }); // 序列化结果符合预期 String m = objectMapper.writeValueAsString(message);
内容的提问来源于stack exchange,提问作者GYUHO CHOI
相关产品推荐
相关产品推荐

