如何为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,具体操作如下:
替换配置基类与配置器类型
放弃传统的StateMachineConfigurerAdapter和StateMachineTransitionConfigurer,改用响应式专属的ReactiveStateMachineConfigurerAdapter与ReactiveStateMachineTransitionConfigurer。在过渡配置中直接调用
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
相关产品推荐
相关产品推荐

