接口参数从 Date 改成 LocalDateTime,调用方报 HessianProtocolException: 'java.time.LocalDateTime' is an unknown class,同一个接口传 Date 就正常。日志里能对上时间点,这种反而好排。

Hessian2 的默认序列化器只认 JDK 自带的老类型,java.time 这些类不在白名单里。序列化时按类名写入,反序列化端找不到对应构造器就抛未知类。这一点先确认清楚,后面就不用反复试。

// 接口边界用 Date 内部再转 LocalDateTime
public Result query(Date from, Date to);

「Hessian2 时间类型」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:接口参数退回 Date 或者用 long 传时间戳;必须用 java.time 就换序列化方式 比如 protobuf 或 json;检查 dubbo 的 serialization 配置 两边要一致;改完把消费者和提供者都重启 别只升一边。

结果对不对很好判断,调用不再抛 unknown class 时间参数能正确传到提供者。

作者 9823189