Google Cloud Firestore变更触发BackgroundFunction解析异常咨询
问题核心解答
可以无需配置自定义ObjectMapper,直接使用BackgroundFunction<DocumentEventData>完成解析。你遇到的报错是Cloud Functions Java运行时默认的无配置Gson实例,无法将Firestore返回的RFC3339格式时间字符串反序列化为DocumentEventData内置的com.google.cloud.Timestamp类型对象导致的,和官方文档操作步骤无关,属于文档未提及的序列化适配缺陷。
具体实现方案
- 第一步:实现Timestamp类型的Gson适配器,处理字符串和Timestamp类型的互转
import com.google.cloud.Timestamp; import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; import java.io.IOException; public class TimestampTypeAdapter extends TypeAdapter<Timestamp> { @Override public void write(JsonWriter out, Timestamp value) throws IOException { if (value == null) { out.nullValue(); return; } out.value(value.toString()); } @Override public Timestamp read(JsonReader in) throws IOException { if (in.peek() == JsonToken.NULL) { in.nextNull(); return null; } return Timestamp.parseTimestamp(in.nextString()); } }
- 第二步:实现自定义GsonProvider,替换运行时默认的Gson实例
import com.google.cloud.functions.GsonProvider; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.cloud.Timestamp; public class FirestoreEventGsonProvider implements GsonProvider { @Override public Gson getGson() { return new GsonBuilder() .registerTypeAdapter(Timestamp.class, new TimestampTypeAdapter()) .create(); } }
- 第三步:注册自定义GsonProvider
在项目的src/main/resources/META-INF/services目录下新建名为com.google.cloud.functions.GsonProvider的文件,写入你实现的FirestoreEventGsonProvider的全类名(例如com.yourpackage.FirestoreEventGsonProvider),函数运行时会自动加载该配置,完成后原有BackgroundFunction<DocumentEventData>代码即可正常运行,无需调整业务逻辑。
内容的提问来源于stack exchange,提问作者EnglishBanana
相关产品推荐
相关产品推荐

