SpringBoot集成Firestore获取Timestamp时触发ClassCastException异常
问题根源
你碰到的ClassCastException是因为**java.util.Date和com.google.cloud.Timestamp属于不同类加载器的类型,无法直接强制转换**。结合你的代码,问题出在两处:
- 方法声明返回
com.google.cloud.Timestamp,但你用document.getDate("created_time")拿到的是java.util.Date,若直接将这个Date转成Timestamp返回,就会触发类型转换异常 - 可能混淆了Firestore SDK获取时间戳的正确API,不同版本的SDK对时间字段的处理逻辑有区别
解决办法
根据你要返回com.google.cloud.Timestamp的需求,有两种可行方案:
方案一:直接获取原生Timestamp
如果你的Firestore SDK版本支持,直接用getTimestamp()方法拿到原生的com.google.cloud.Timestamp,跳过类型转换步骤:
public Timestamp getUsers() throws ExecutionException, InterruptedException { DocumentReference docRef = firestore.collection("usuarios").document("XHlUdE5516ZT2EEoBBiXvW0De4z1"); ApiFuture<DocumentSnapshot> future = docRef.get(); Timestamp result = null; try { DocumentSnapshot document = future.get(); if (document.exists()) { // 直接获取com.google.cloud.Timestamp类型的时间戳 result = document.getTimestamp("created_time"); System.out.println("Timestamp: " + result); } else { System.out.println("Document not found!"); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } return result; }
方案二:把Date转换成Timestamp
如果必须用getDate()拿到Date对象,不要直接强制转换,用Timestamp的静态方法fromDate()来完成转换:
public Timestamp getUsers() throws ExecutionException, InterruptedException { DocumentReference docRef = firestore.collection("usuarios").document("XHlUdE5516ZT2EEoBBiXvW0De4z1"); ApiFuture<DocumentSnapshot> future = docRef.get(); Timestamp result = null; try { DocumentSnapshot document = future.get(); if (document.exists()) { Date date = document.getDate("created_time"); System.out.println("Date: " + date); // 用Timestamp的静态方法完成类型转换 result = Timestamp.fromDate(date); } else { System.out.println("Document not found!"); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } return result; }
额外提醒
- 检查你的Firestore SDK依赖版本,确保使用的API与版本匹配(部分旧版本可能没有
getTimestamp方法) - 不要混淆
java.sql.Timestamp和com.google.cloud.Timestamp,这两个是完全不同的类,容易引发类型错误
内容的提问来源于stack exchange,提问作者Pedro Sobral
相关产品推荐
相关产品推荐

