We need to create validators for each status. The validator will check if transition from current state is allowed or not. All validators are injected into WorkflowExecutionValidator. private List<Validator> validators WorkflowExecutionValidator will pick up an appropriate validator from a list and check if transition is allowed. Validators are implemented for each workflow execution status Validators are applied in production code
@Data public class WorkflowExecutionValidator { private List<Validator> validators; public void validate(WorkflowExecutionStatus current, WorkflowExecutionStatus target) { // 1. select validator based on current status // 2. apply validator to check if the transition is allowed } }