小程序开发-服务端
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

证书管理服务修复报告

问题描述

在将整站时间格式从 java.util.Date 统一修改为 java.time.LocalDateTime 后,CertificateService 类出现了类型不匹配的问题。

发现的问题

1. 类型不一致问题

  • 字段声明CertificateInfo 类中的 notBeforenotAfter 字段声明为 LocalDateTime
  • Getter/Setter:但是对应的 getter/setter 方法返回和接收的是 Date 类型
  • 方法调用validateX509Certificate 方法中调用 setNotBeforesetNotAfter 时传入的是 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 - 批量时间格式转换

总结

证书管理服务及相关的时间格式问题已全面修复:

  1. 所有时间字段统一使用 LocalDateTime 类型
  2. 保持了与底层证书API的兼容性
  3. 清理了所有重复导入
  4. 修复了工具类中的类型不匹配问题

时间兼容性问题修复

🔧 修复的兼容性问题

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个

整个项目的时间格式统一工作已完成,所有兼容性问题已解决,建议进行全面测试验证。