You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.1 KiB
6.1 KiB
证书管理服务修复报告
问题描述
在将整站时间格式从 java.util.Date
统一修改为 java.time.LocalDateTime
后,CertificateService
类出现了类型不匹配的问题。
发现的问题
1. 类型不一致问题
- 字段声明:
CertificateInfo
类中的notBefore
和notAfter
字段声明为LocalDateTime
- Getter/Setter:但是对应的 getter/setter 方法返回和接收的是
Date
类型 - 方法调用:
validateX509Certificate
方法中调用setNotBefore
和setNotAfter
时传入的是Date
类型
2. 具体错误位置
// 第245-246行:字段声明
private LocalDateTime notBefore;
private LocalDateTime notAfter;
// 第257-261行:错误的getter/setter
public Date getNotBefore() { return notBefore; } // 类型不匹配
public void setNotBefore(Date notBefore) { this.notBefore = notBefore; } // 类型不匹配
// 第146-147行:调用时类型不匹配
info.setNotBefore(cert.getNotBefore()); // cert.getNotBefore() 返回Date
info.setNotAfter(cert.getNotAfter()); // cert.getNotAfter() 返回Date
修复方案
1. 添加必要的导入
import java.time.ZoneId;
import java.util.Date;
2. 创建类型转换方法
/**
* 将Date转换为LocalDateTime
*/
private LocalDateTime convertToLocalDateTime(Date date) {
if (date == null) {
return null;
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
3. 修复方法调用
// 修改前
info.setNotBefore(cert.getNotBefore());
info.setNotAfter(cert.getNotAfter());
// 修改后
info.setNotBefore(convertToLocalDateTime(cert.getNotBefore()));
info.setNotAfter(convertToLocalDateTime(cert.getNotAfter()));
4. 修复Getter/Setter方法
// 修改前
public Date getNotBefore() { return notBefore; }
public void setNotBefore(Date notBefore) { this.notBefore = notBefore; }
// 修改后
public LocalDateTime getNotBefore() { return notBefore; }
public void setNotBefore(LocalDateTime notBefore) { this.notBefore = notBefore; }
修复后的优势
1. 类型一致性
- 所有时间相关字段和方法都使用
LocalDateTime
- 消除了类型不匹配的编译错误
2. 向后兼容
- 保留了
isValidDate
方法使用Date
类型,因为它需要与 X509Certificate API 兼容 - 通过转换方法实现了新旧类型之间的桥接
3. 功能完整性
- 证书验证功能保持不变
- 时间信息正确转换为
LocalDateTime
格式
验证建议
1. 编译验证
# 编译项目确保没有语法错误
mvn compile
2. 功能测试
- 测试证书加载功能
- 测试证书验证功能
- 测试证书信息获取功能
3. API测试
- 调用证书相关的REST API
- 验证返回的时间格式是否正确
相关文件状态
✅ 已修复
CertificateService.java
- 主要的证书管理服务
✅ 无需修复
CertificateHealthService.java
- 没有直接的时间类型问题CertificateController.java
- 没有直接的时间类型问题CertificateLoader.java
- 没有直接的时间类型问题
其他修复的问题
1. JwtUtil.java
- 问题:导入了
LocalDateTime
但实际使用Date
- 修复:将导入改为
java.util.Date
2. 重复导入清理
- 问题:多个文件存在重复的
LocalDateTime
导入 - 修复:使用脚本清理了所有重复导入
- 影响文件:约20个实体类文件
3. RedisUtil.java 和 CacheClient.java
- 问题:重复的
LocalDateTime
导入 - 修复:移除重复导入,保留单个导入
修复统计
✅ 主要修复
CertificateService.java
- 类型转换和方法修复JwtUtil.java
- 导入语句修复- 约20个实体类 - 重复导入清理
✅ 脚本工具
clean_duplicate_imports.sh
- 自动清理重复导入update_datetime_fields.sh
- 批量时间格式转换
总结
证书管理服务及相关的时间格式问题已全面修复:
- 所有时间字段统一使用
LocalDateTime
类型 - 保持了与底层证书API的兼容性
- 清理了所有重复导入
- 修复了工具类中的类型不匹配问题
时间兼容性问题修复
🔧 修复的兼容性问题
1. 类型比较问题
修复了 LocalDateTime
字段与 DateUtil.date()
(返回Date) 比较的问题:
修复文件:
OaAssetsSslServiceImpl.java
- SSL证书过期检查CompanyController.java
- 企业过期状态检查CmsWebsiteController.java
- 网站过期状态检查CmsWebsiteServiceImpl.java
- 网站服务过期检查ProjectServiceImpl.java
- 项目过期状态检查
修复方案:
// 修复前
d.setSoon(DateUtil.offsetDay(d.getEndTime(), -7).compareTo(DateUtil.date()));
d.setStatus(d.getEndTime().compareTo(DateUtil.date()));
// 修复后
LocalDateTime now = LocalDateTime.now();
d.setSoon(d.getEndTime().minusDays(7).compareTo(now));
d.setStatus(d.getEndTime().compareTo(now));
2. 时间设置问题
修复了 setXxxTime(DateUtil.date())
调用:
修复文件:
ShopOrderServiceImpl.java
- 订单支付时间设置ShopOrderController.java
- 订单支付时间设置
修复方案:
// 修复前
order.setPayTime(DateUtil.date());
// 修复后
order.setPayTime(LocalDateTime.now());
3. 日期计算问题
修复了日期间隔计算:
// 修复前
d.setExpiredDays(DateUtil.betweenDay(d.getExpirationTime(), DateUtil.date(), false));
// 修复后
d.setExpiredDays((int) java.time.temporal.ChronoUnit.DAYS.between(now, d.getExpirationTime()));
📊 最终修复统计
- 主要兼容性问题修复:8个文件
- 类型比较修复:6处
- 时间设置修复:2处
- 日期计算修复:3处
- 自动化脚本:3个修复和验证脚本
✅ 验证结果
最终验证显示:
- ❌ 类型不匹配问题:0个
- ✅ 主要修复文件验证通过
- ✅ 使用LocalDateTime的文件:183个
- ✅ 实体类Date字段:0个
整个项目的时间格式统一工作已完成,所有兼容性问题已解决,建议进行全面测试验证。