Class StatusTransition
java.lang.Object
io.leandev.appfuse.entity.StatusTransition
狀態流轉工具類
提供狀態流轉驗證的靜態方法,協助 Service 層驗證狀態變更是否合法。
設計原則:
- 框架只提供驗證工具,不定義狀態流轉規則
- 狀態流轉規則由應用層的 Status 列舉定義
- 驗證失敗時拋出
ConflictException(HTTP 409)
Status 列舉建議實作:
public enum OrderStatus {
PENDING("待處理"),
CONFIRMED("已確認"),
COMPLETED("已完成"),
CANCELLED("已取消");
private final String label;
// 狀態流轉規則
private static final Map<OrderStatus, List<OrderStatus>> TRANSITIONS = Map.of(
PENDING, List.of(CONFIRMED, CANCELLED),
CONFIRMED, List.of(COMPLETED, CANCELLED),
COMPLETED, List.of(),
CANCELLED, List.of()
);
public boolean canTransitionTo(OrderStatus target) {
List<OrderStatus> allowed = TRANSITIONS.get(this);
return allowed != null && allowed.contains(target);
}
public List<OrderStatus> getAllowedTransitions() {
return TRANSITIONS.getOrDefault(this, List.of());
}
public boolean isTerminal() {
return this == COMPLETED || this == CANCELLED;
}
}
Service 層使用範例:
public Order updateStatus(String id, OrderStatus newStatus) {
Order order = repository.findById(id).orElseThrow(...);
// 方式 1:使用方法參考
StatusTransition.validate(
order.getStatus(),
newStatus,
OrderStatus::canTransitionTo,
"Order"
);
// 方式 2:使用 getAllowedTransitions
StatusTransition.validate(
order.getStatus(),
newStatus,
OrderStatus::getAllowedTransitions,
"Order"
);
order.setStatus(newStatus);
return repository.save(order);
}
- See Also:
-
Method Summary
Modifier and TypeMethodDescriptionstatic <S extends Enum<S>>
booleancanTransition(S from, S to, BiPredicate<S, S> canTransition) 檢查狀態流轉是否合法(不拋出例外)static <S extends Enum<S>>
booleancanTransition(S from, S to, Function<S, List<S>> getAllowedTransitions) 檢查狀態流轉是否合法(使用允許列表,不拋出例外)static <S extends Enum<S>>
voidvalidate(S from, S to, BiPredicate<S, S> canTransition, String entityType) 驗證狀態流轉是否合法static <S extends Enum<S>>
void驗證狀態流轉是否合法(使用允許列表)
-
Method Details
-
validate
public static <S extends Enum<S>> void validate(S from, S to, BiPredicate<S, S> canTransition, String entityType) 驗證狀態流轉是否合法
使用
canTransition函數驗證,如驗證失敗拋出ConflictException。- Type Parameters:
S- 狀態列舉型別- Parameters:
from- 來源狀態to- 目標狀態canTransition- 驗證函數,接收 (from, to) 返回是否允許entityType- 實體類型名稱(用於錯誤訊息)- Throws:
ConflictException- 如果狀態流轉不合法
-
validate
public static <S extends Enum<S>> void validate(S from, S to, Function<S, List<S>> getAllowedTransitions, String entityType) 驗證狀態流轉是否合法(使用允許列表)
使用
getAllowedTransitions函數取得允許的目標狀態列表, 檢查目標狀態是否在列表中。- Type Parameters:
S- 狀態列舉型別- Parameters:
from- 來源狀態to- 目標狀態getAllowedTransitions- 取得允許轉換列表的函數entityType- 實體類型名稱(用於錯誤訊息)- Throws:
ConflictException- 如果狀態流轉不合法
-
canTransition
public static <S extends Enum<S>> boolean canTransition(S from, S to, BiPredicate<S, S> canTransition) 檢查狀態流轉是否合法(不拋出例外)- Type Parameters:
S- 狀態列舉型別- Parameters:
from- 來源狀態to- 目標狀態canTransition- 驗證函數- Returns:
- true 如果流轉合法
-
canTransition
-