MongoDB变更流中Binary BSON格式UUID的解码问题
MongoDB变更流中UUID类型Document Key的解码方案
问题核心
Java应用用UUID作为MongoDB文档ID,变更流返回的document_key是BSON Binary类型(subType 04),直接解码Base64得到乱码,本质是UUID在BSON中的存储字节序与Java默认解析逻辑不匹配。
BSON的subType 04对应RFC 4122标准UUID,采用大端字节序存储;而Java原生UUID.fromString基于字符串解析,直接转换字节数组时默认用小端序,导致解析错误。
手动解码实现(纯Java)
直接解析Base64字节数组,按大端字节序转换为UUID:
import java.util.Base64; import java.util.UUID; public class BsonUuidDecoder { public static UUID decodeBsonUuid(String base64Str) { byte[] bytes = Base64.getDecoder().decode(base64Str); long mostSigBits = 0; long leastSigBits = 0; // 处理前8字节(高位部分),大端转long for (int i = 0; i < 8; i++) { mostSigBits = (mostSigBits << 8) | (bytes[i] & 0xff); } // 处理后8字节(低位部分),大端转long for (int i = 8; i < 16; i++) { leastSigBits = (leastSigBits << 8) | (bytes[i] & 0xff); } return new UUID(mostSigBits, leastSigBits); } public static void main(String[] args) { String base64 = "rpUsTqcGSZ+YPDzebvq2aA=="; UUID uuid = decodeBsonUuid(base64); System.out.println(uuid.toString()); } }
利用MongoDB Java驱动简化处理
如果项目中已经引入MongoDB Java驱动,直接用内置的UuidCodec处理,无需手动转换:
import org.bson.UuidRepresentation; import org.bson.codecs.UuidCodec; import org.bson.types.Binary; // 从变更流获取的Binary类型ID Binary binaryId = ...; // 指定用标准UUID格式解析 UuidCodec codec = new UuidCodec(UuidRepresentation.STANDARD); UUID uuid = codec.decode(binaryId.asBsonReader(), null);
内容的提问来源于stack exchange,提问作者Zazz
相关产品推荐
相关产品推荐

