You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Spring State Machine外部配置添加Reactive Guard?

Spring State Machine 3.2.1 响应式Guard配置问题解决方案

问题描述

我正在使用Spring State Machine 3.2.1开发响应式Java项目,已创建如下ReactiveGuard:

public ReactiveGuard<BookingState, BookingEvent> bookingIdGuard(){
  return context -> //执行校验并返回Mono<Boolean>的函数
}

尝试将其添加到外部过渡配置(与SSM 2.x中的操作方式类似)时,却找不到对应的方法:

@Override
public void configure(StateMachineTransitionConfigurer<BookingState, BookingEvent> transitions) throws Exception {
transitions
 .withExternal()
 .source(BookingState.FIRST)
 .target(BookingState.SECOND)
 .event(BookingEvent.APPROVE)
 //找不到添加Reactive Guard的方法
}

请问该如何将Reactive Guard添加到配置中?

解决方案

Spring State Machine 3.x版本对同步、响应式API做了明确拆分,你需要切换到响应式版本的配置体系来添加ReactiveGuard,具体操作如下:

  1. 替换配置基类与配置器类型
    放弃传统的StateMachineConfigurerAdapter和StateMachineTransitionConfigurer,改用响应式专属的ReactiveStateMachineConfigurerAdapter与ReactiveStateMachineTransitionConfigurer。

  2. 在过渡配置中直接调用guard()方法
    响应式过渡构建器原生支持传入ReactiveGuard实例,直接通过guard()方法绑定即可。

完整配置示例:

import org.springframework.context.annotation.Configuration;
import org.springframework.statemachine.config.builders.ReactiveStateMachineTransitionConfigurer;
import org.springframework.statemachine.config.configuration.ReactiveStateMachineConfigurerAdapter;
import org.springframework.statemachine.config.model.ConfigurationData;
import org.springframework.statemachine.config.model.StatesData;

import java.util.EnumSet;

@Configuration
public class BookingStateMachineConfig extends ReactiveStateMachineConfigurerAdapter<BookingState, BookingEvent> {

    // 定义你的ReactiveGuard
    private ReactiveGuard<BookingState, BookingEvent> bookingIdGuard() {
        return context -> {
            // 这里实现校验逻辑,返回Mono<Boolean>
            return Mono.just(true);
        };
    }

    @Override
    public void configure(ReactiveStateMachineTransitionConfigurer<BookingState, BookingEvent> transitions) throws Exception {
        transitions
                .withExternal()
                .source(BookingState.FIRST)
                .target(BookingState.SECOND)
                .event(BookingEvent.APPROVE)
                .guard(bookingIdGuard()); // 添加ReactiveGuard
    }

    // 配置状态集
    @Override
    public void configure(StatesData.Builder<BookingState, BookingEvent> states) throws Exception {
        states
                .initial(BookingState.FIRST)
                .states(EnumSet.allOf(BookingState.class));
    }

    // 配置基础参数
    @Override
    public void configure(ConfigurationData.Builder<BookingState, BookingEvent> config) throws Exception {
        config.autoStartup(true);
    }
}

关键说明

  • SSM 3.x将同步、响应式API完全分离,StateMachineTransitionConfigurer属于同步体系,不兼容ReactiveGuard;只有ReactiveStateMachineTransitionConfigurer才能处理响应式组件。
  • 必须确保配置类继承ReactiveStateMachineConfigurerAdapter,这样所有配置方法都会自动使用响应式版本的构建器,避免API不匹配问题。

内容的提问来源于stack exchange,提问作者ljmelgui

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 17:55:06