簡體   English   中英

Spring狀態機管理JPA實體

[英]Spring state machine to manage JPA entity

我有一個具有字段stateTask JPA @ @Entity因此看起來狀態機可以很好地使用。 state可以通過調用類似形式的REST端點改變PUT /api/tasks/{id}/state 我想利用ActionsGuards的概念,因為它看起來像是很好的抽象。 我想我需要一些東西:

  1. 在REST端點中,以與當前Tasks的狀態相對應的狀態創建(或還原?)狀態機,並將JPA實體與其上下文關聯起來,以便Action可以使用它來更改state任務的state字段(以及其他狀態) )並通過Repository其保留
  2. 發送代表過渡到新狀態的事件

我假設第1點將像@EnableStateMachineFactory一樣通過生成器創建計算機,您實際上不能真正在特定狀態下創建計算機(這是有道理的)。 我不清楚如何添加實體,我大概findOne@Repository狀態機的上下文。

那是正確的方法嗎? 有樣本涵蓋嗎? 我很誠實地瀏覽了現有樣本,沒有發現任何類似的東西。

我可以建議使用Spring構建REST服務中的教程嗎? 如果您從頭開始,則將看到在創建基於REST的服務時如何添加依賴於對象狀態的操作。

你應該先問自己-你真的真的需要這樣的狀態機(我不知道你充分利用的情況下)。 StateMachine將在您的代碼中引入一些(很多?)復雜性。

話雖如此,這是一個可能的設計:

1)為實體實現標准的SOA(例如TaskController > TaskService > TaskRepository )。

2)創建Service (W) ,其唯一目的是創建事件並將其發送到SM。 在該Service (W) ,將注入SM factoryTaskService (用於加載現有Task的狀態)。

4)當請求/事件發送到TaskController ,您將調用Service (W) ,它將執行以下操作:

  • 實例化一個新的SM,如果Task存在,則用Task 的狀態重新補充SM的狀態
  • SM初始化后,發送事件

5)在狀態機配置中,您將具有與該事件關聯的源,目標和操作。 該操作將調用TaskService並更新JPA實體。

如果在需要更新實體時您具有復雜的業務規則,並且希望可能的狀態轉換是確定性的(例如,您具有預定義的工作流程或狀態圖),則此設計很有意義。 每個狀態轉換之前的業務規則都可以抽象為警衛,而SM可以是其他人與您的JPA實體進行交互(更新)的接口。

對於JPA Entity的補水狀態機,請參閱此答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM