在项目中出现License签名验证失败的问题,根本原因是YudaoJacksonAutoConfiguration中配置的全局LocalDateTime序列化器与LicenseGenerator中的序列化配置不一致。
TimestampLocalDateTimeSerializer将LocalDateTime序列化为时间戳(Long类型)WRITE_DATES_AS_TIMESTAMPS,将LocalDateTime序列化为ISO格式字符串修改LicenseGenerator构造函数,使其与项目的全局配置保持一致:
public LicenseGenerator() {
this.objectMapper = new ObjectMapper();
this.objectMapper.registerModule(new JavaTimeModule());
// 使用与项目一致的LocalDateTime序列化配置,确保签名数据一致性
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(LocalDateTime.class, TimestampLocalDateTimeSerializer.INSTANCE);
simpleModule.addDeserializer(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE);
this.objectMapper.registerModule(simpleModule);
this.objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
}
更新appendField方法,确保时间字段在签名数据中也使用时间戳格式:
private void appendField(StringBuilder sb, String fieldName, Object value) {
sb.append(fieldName).append("=");
if (value != null) {
// 对LocalDateTime字段使用时间戳格式,确保与JSON序列化一致
if (value instanceof LocalDateTime) {
LocalDateTime dateTime = (LocalDateTime) value;
long timestamp = dateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
sb.append(timestamp);
} else {
sb.append(value.toString());
}
}
sb.append(";");
}
运行LicenseSignatureTest验证修复效果:
=== 序列化结果比较 ===
序列化结果是否一致: ✓ 是
=== 时间字段格式测试 ===
原始LocalDateTime: 2025-08-13T00:54:47.875317500
toString()格式: 2025-08-13T00:54:47.875317500
时间戳格式: 1755017687875
JSON序列化: 1755017687875
=== 签名数据生成测试 ===
生成的签名数据:
licenseId=TEST-LICENSE-001;customerName=测试客户;productName=测试产品;productVersion=1.0.0;createdTime=1755017687875;startTime=1755017687875;endTime=1757609687875;strategy=GRACEFUL_SHUTDOWN;gracePeriodDays=;warningDays=;maxUsers=100;
=== 测试完成 ===
结论: 修复成功,时间序列化格式已统一
LicenseGenerator.java
新增文件
LICENSE_SIGNATURE_ISSUE_SOLUTION.md:问题分析和解决方案文档LicenseSignatureTest.java:签名一致性测试工具SIGNATURE_FIX_SUMMARY.md:修复总结文档修复状态: ✅ 已完成
验证状态: ✅ 已通过
修复时间: 2025-08-13