如何将Spring状态机用于Order对象

Kho*_*yen 2 java spring spring-mvc spring-statemachine

我正在尝试在我的项目中使用Spring State Machine,因为有一个对象Order具有多个状态

  • 支付
  • 包装的
  • DELIVERED
  • 取消

该对象可以如下实现

public class Order {
  private String id;
  private Customer customer;
  private OrderState state;
// Some other fields with getter and setter
}
Run Code Online (Sandbox Code Playgroud)

我介绍了OrderService,从DB获取订单,设置包括OrderState在内的一些信息,然后保存到DB.

但是我不知道如何将Spring状态机应用到这个中,是否过于复杂而无法使用这样的简单目的?

mir*_*sif 8

定义你的状态

public enum OrederStates {
   NEW, PAID, PACKAGED; // etc
}
Run Code Online (Sandbox Code Playgroud)

然后定义您的活动

public enum OrderEvents {
    PAYMENT, PACK, DELIVER; // etc 
}
Run Code Online (Sandbox Code Playgroud)

然后声明你的事件监听器

@WithStateMachine
public class OrderEventHandler {
    @Autowired
    OrderService orderService;

    @OnTransition(src= "NEW",target = "PAID")
    handlePayment() {
       // Your code orderService.*
       // ..   
    }
    // Other handlers
}
Run Code Online (Sandbox Code Playgroud)

现在配置您的应用程序以使用状态机

@Configuration
@EnableStateMachine
static class Config1 extends EnumStateMachineConfigurerAdapter<States, Events> {

    @Override
    public void configure(StateMachineStateConfigurer<States, Events> states)
            throws Exception {
        states
            .withStates()
                .initial(OrderStates.NEW)
                .states(EnumSet.allOf(OrderStates.class));
    }

    @Override
    public void configure(StateMachineTransitionConfigurer<States, Events> transitions)
            throws Exception {
        transitions
            .withExternal()
                .source(OrderStates.NEW).target(OrderStates.PAID)
                .event(OrderEvents.PAYMENT)
                .and()
            .withExternal()
                .source(OrderStates.PAID).target(OrderStates.PACKED)
                .event(OrderEvents.PACK);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后在您的应用程序/控制器中使用它

public class MyApp {

    @Autowired
    StateMachine<States, Events> stateMachine;

    void doSignals() {
        stateMachine.start();
        stateMachine.sendEvent(OrderEvents.PAYMENT);
        stateMachine.sendEvent(Events.PACK);
    }
 }
Run Code Online (Sandbox Code Playgroud)

使用本指南的入门状态机,这referce了解更多信息.

  • 一个非常好的总结,但是我不确定它是否解决了实际的用例 - 改变了特定订单的状态. (2认同)