我试图使用SpringStateMachine构建器从yml文件配置状态机。它对状态和转换很好,但是当我试图包括一些子状态时,我得到了下面的异常。
org.springframework.stateMachine.config.model.malformedConfigurationException:初始状态未设置在org.springframework.stateMachine.config.model.verifier.baseStructureRevier.verify(BaseStructureRevier.java:59)~[spring-stateMachine-core-2.1.3.release.jar:2.1.3.release]在.abstractStateMachineFactory.getStateMachineFactory(abstractStateMachineFactory.java:173)~[spring-stateMachine-core-2.1.3.release.jar:2.1.3.release]在.jar:2.1.3.发布]
这是我的yml文件
states:
initial: INITIAL_STEP
end: END_STEP
states:
INITIAL_STEP :
SECOND_STEP :
- SECOND_STEP_ONE
- SECOND_STEP_TWO
- SECOND_STEP_THREE
END_STEP :
transList:
-
source: INITIAL_STEP
target: SECOND_STEP
event: INITIAL_STEP_UP
action: initialAction
-
source: SECOND_STEP
target: END_STEP
event: SECOND_STEP
action: secondAction
下面是我的Spring状态机类
@Configuration
public class MyStateMachineEngine {
private static Logger logger = LogManager.getLogger(MyStateMachineEngine.class);
@Autowired
private StateConfig stateconfig;
@Bean(name = "authStateMachine")
@SessionScope(proxyMode = ScopedProxyMode.TARGET_CLASS)
public StateMachine<String, String> buildStateEngine() {
Builder<String, String> builder = StateMachineBuilder.builder();
try {
if (stateconfig != null) {
Map<String,List<String>> stateListMap = stateconfig.getStates();
List<TransProp> transList = stateconfig.getTransList();
final StateConfigurer<String, String> stateConfigurer = builder.configureStates().withStates()
.initial(stateconfig.getInitial()).end(stateconfig.getEnd());
stateListMap.keySet().forEach(state -> configureState(state,stateListMap.get(state), stateConfigurer));
logger.info(transList.size());
transList.forEach(trans -> addTransaction(builder, trans));
builder.configureConfiguration().withConfiguration().autoStartup(true).beanFactory(null)
.machineId("OSTMACHINE");
} else {
logger.error("State initialization error please verify state config");
}
} catch (Exception e) {
e.printStackTrace();
}
return builder.build();
}
private void configureState(String state, List<String> childStateList, StateConfigurer<String, String> stateConfigurer) {
stateConfigurer.state(state);
if(!childStateList.isEmpty()) {
childStateList.forEach(childState -> stateConfigurer.parent(state).initial(childState).state(childState));
}
}
private void addTransaction(Builder<String, String> builder, TransProp transProp) {
try {
if (null != transProp) {
if (StringUtils.isBlank(transProp.getGuard())) {
builder.configureTransitions().withExternal().source(transProp.getSource())
.target(transProp.getTarget()).event(transProp.getEvent());
} else {
builder.configureTransitions().withExternal().source(transProp.getSource())
.target(transProp.getTarget()).guard(new BaseGuard()).event(transProp.getEvent());
}
}
} catch (Exception e) {
logger.error("Error when configuring states ", e);
new RuntimeException(e);
}
}
}
当我在本地系统上运行您的代码时,我发现了问题。问题出在您的configureState方法中,您已经完成了状态配置,应该是这样的:-
private void configureState(String state, List<String> childStateList,
StateConfigurer<String, String> stateConfigurer) {
stateConfigurer.state(state);
if (!childStateList.isEmpty()) {
childStateList.forEach(childState -> {
try {
stateConfigurer.and().withStates().parent(state).initial(childState).state(childState);
} catch (Exception e) {
e.printStackTrace();
}
});
}
}
有关更多信息,您可以参考链接
我正在使用React-useState创建状态为的对象。在成功调用API后,将更新为数据对象。 我有一个表单可以更改此状态,但我还有一个取消按钮。单击“取消”时,如何将此状态恢复为其初始值(API调用后)? 我应该创建另一个状态变量和存储初始状态在那里,然后更新我的状态基于?
本文向大家介绍Redux怎样设置初始状态?相关面试题,主要包含被问及Redux怎样设置初始状态?时的应答技巧和注意事项,需要的朋友参考一下 它必须是createStore的第二个参数: const rootReducer = combineReducers({ todos: todos, visibilityFilter: visibilityFilter }); const initialSta
概述 Javascript Finite State Machine函数库 参考链接 概述 有限状态机(Finite-state machine)是一个非常有用的模型,可以模拟世界上大部分事物。 简单说,它有三个特征: 状态总数(state)是有限的。 任一时刻,只处在一种状态之中。 某种条件下,会从一种状态转变(transition)到另一种状态。 它对JavaScript的意义在于,很多对象可
这两个是等价的吗?如果不是,哪一个是最好的,为什么?
本文向大家介绍react-native 初始化状态,包括了react-native 初始化状态的使用技巧和注意事项,需要的朋友参考一下 示例 您应该像这样在组件的构造函数内部初始化状态: 使用setState可以更新视图。
我有两个React组件,即和使用了一些重要的UI组件,但我相信它们与我的问题无关。 在,使用effect调用,该函数解析为一个类别数组,例如,。 我的目标是访问父组件()中复选框的状态(选中或未选中)。我采取了这个问题中建议的方法。(见验证答案) 有趣的是,当我记录