概要
Task.java および Tenant.java の @PrePersist / @PreUpdate コールバックで LocalDateTime.now() を直接使用しており、JVM のシステムクロックに依存している。
問題点
// Task.java / Tenant.java 共通
void onCreate() {
LocalDateTime now = LocalDateTime.now(); // JVM のシステム TZ・クロックに依存
...
}
対応案
Spring の Clock Bean をインジェクションして LocalDateTime.now(clock) を使用する。Clock は Clock.system(ZoneId.of("Asia/Tokyo")) で定義し、TZ 強制とテスト時の差し替え(Clock.fixed(...))を両立する。
@Configuration
class ClockConfig {
@Bean
Clock clock() {
return Clock.system(ZoneId.of("Asia/Tokyo"));
}
}
// Entity 側
@Autowired private Clock clock;
@PrePersist
void onCreate() {
LocalDateTime now = LocalDateTime.now(clock);
this.createdAt = now;
this.updatedAt = now;
}
影響ファイル
webapi/src/main/java/xyz/dgz48/tasks/webapi/task/Task.java
webapi/src/main/java/xyz/dgz48/tasks/webapi/tenant/Tenant.java
参考
概要
Task.javaおよびTenant.javaの@PrePersist/@PreUpdateコールバックでLocalDateTime.now()を直接使用しており、JVM のシステムクロックに依存している。問題点
Asia/Tokyo統一前提だが、LocalDateTime.now()直接呼び出しは JVM デフォルト TZ・クロックに依存するため、TZ 強制が崩れた場合(単発テストでTZが未設定で実行された等)に静かにズレるcreatedAt/updatedAtの値を厳密にアサートするテストが書けない対応案
Spring の
ClockBean をインジェクションしてLocalDateTime.now(clock)を使用する。Clock はClock.system(ZoneId.of("Asia/Tokyo"))で定義し、TZ 強制とテスト時の差し替え(Clock.fixed(...))を両立する。影響ファイル
webapi/src/main/java/xyz/dgz48/tasks/webapi/task/Task.javawebapi/src/main/java/xyz/dgz48/tasks/webapi/tenant/Tenant.java参考