Spring State Machine для управления сущностью JPA - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть Task JPA @Entity, у которого есть поле state - так что похоже, что конечный автомат может быть хорошей абстракцией для работы.state может измениться, вызвав конечную точку REST в форме, подобной PUT /api/tasks/{id}/state.Я хотел использовать концепцию Actions, Guards, так как это выглядит как хорошая абстракция.Я думаю, мне нужно кое-что вместе:

  1. В конечной точке REST создать (или, скорее, восстановить?) Конечный автомат в состоянии, соответствующем текущему состоянию Tasks, и связать сущность JPA с ее контекстомпоэтому он доступен для Action s, которые могут изменить поле состояния задачи state (и другие) и сохранить его обратно через Repository
  2. Отправить событие, представляющее переход в новое состояние

Я предполагаю, что пункт 1. создаст машину с помощью компоновщика, так как с @EnableStateMachineFactory вы не сможете создать машину в определенном состоянии (что имеет смысл).Мне неясно, как добавить сущность, которую я, вероятно, findOne в @Repository, в контекст конечного автомата.

Это был бы правильный подход?Есть образец, покрывающий это?Я был довольно честен в изучении существующих образцов и не нашел ничего похожего.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Сначала вы должны спросить себя - нужен ли вам действительно , действительно конечный автомат для этого (я не знаю ваш полный вариант использования).StateMachine привнесет некоторую (большую?) Сложность в ваш код.

При этом возможен такой дизайн:

1) Реализация стандартного SOA для сущности (например, TaskController -> TaskService -> TaskRepository).

2) Создать Service (W), единственной целью которого является создание событий и их отправка на SM.В этом Service (W) вам будут введены SM factory и TaskService (для загрузки состояния существующего Task).

4) Когда запрос / событие отправляется на TaskController, вы будете вызывать Service (W), который будет делать следующее:

5) В конфигурации конечного автомата у вас будет источник, цель и действие, связанные с этим событием.Действие вызовет TaskService и обновит сущность JPA.

Этот дизайн имеет смысл, если у вас есть сложные бизнес-правила, когда необходимо обновить сущность, и вы хотите, чтобы возможные переходы состояний были детерминированными (например, выиметь заранее определенный рабочий процесс или диаграмму состояний).Бизнес-правила перед каждым переходом состояния могут быть абстрагированы как защитные, и SM может быть интерфейсом, через который другие взаимодействуют (обновляют) с вашей сущностью JPA.

Для регидрирования конечного автомата из сущности JPA, пожалуйста, смотри этот ответ .

0 голосов
/ 18 декабря 2018

Могу ли я предложить учебное пособие на Создание служб REST с помощью Spring ?Если вы проработаете его полностью, вы увидите, как добавлять действия, которые зависят от состояния объекта, при создании службы на основе REST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...