Java 带有子状态的Spring状态机生成器抛出错误-“;“初始状态未设置”;
我正在尝试使用SpringStateMachineBuilder从yml文件配置状态机。 它可以很好地处理状态和转换,但是当我尝试包含一些子状态时,我得到了下面的异常 org.springframework.statemachine.config.model.MalformedConfiguration异常:未设置初始状态 在org.springframework.statemachine.config.model.verifier.BaseStructureVerifier.verify(BaseStructureVerifier.java:59)~[spring-statemachine-core-2.1.3.RELEASE.jar:2.1.3.RELEASE] 在org.springframework.statemachine.config.model.verifier.CompositeStateMachineModelVerifier.verify(CompositeStateMachineModelVerifier.java:43)~[spring-statemachine-core-2.1.3.RELEASE.jar:2.1.3.RELEASE] 在org.springframework.statemachine.config.AbstractStateMachineFactory.getStateMachine(AbstractStateMachineFactory.java:173)~[spring-statemachine-core-2.1.3.RELEASE.jar:2.1.3.RELEASE] 在org.springframework.statemachine.config.AbstractStateMachineFactory.getStateMachine(AbstractStateMachineFactory.java:143)~[spring-statemachine-core-2.1.3.RELEASE.jar:2.1.3.RELEASE] 在org.springframework.statemachine.config.StateMachineBuilder$Builder.build(StateMachineBuilder.java:155)~[spring-statemachine-core-2.1.3.RELEASE.jar:2.1.3.RELEASE] 这是我的yml文件Java 带有子状态的Spring状态机生成器抛出错误-“;“初始状态未设置”;,java,spring-boot,state-machine,spring-statemachine,Java,Spring Boot,State Machine,Spring Statemachine,我正在尝试使用SpringStateMachineBuilder从yml文件配置状态机。 它可以很好地处理状态和转换,但是当我尝试包含一些子状态时,我得到了下面的异常 org.springframework.statemachine.config.model.MalformedConfiguration异常:未设置初始状态 在org.springframework.statemachine.config.model.verifier.BaseStructureVerifier.verify(Ba
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);
}
}
}
@配置
公共类MyStateMachineEngine{
私有静态记录器Logger=LogManager.getLogger(MyStateMachineEngine.class);
@自动连线
私有StateConfig StateConfig;
@Bean(name=“authStateMachine”)
@会话范围(proxyMode=ScopedProxyMode.TARGET\u类)
公共状态机buildStateEngine(){
Builder=StateMachineBuilder.Builder();
试一试{
if(stateconfig!=null){
Map stateListMap=stateconfig.getStates();
List transList=stateconfig.getTransList();
final StateConfigurer 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().AutoStart(true).beanFactory(null)
.machineId(“OSTMACHINE”);
}否则{
logger.error(“状态初始化错误,请验证状态配置”);
}
}捕获(例外e){
e、 printStackTrace();
}
返回builder.build();
}
私有无效配置状态(字符串状态、列表子状态列表、状态配置器状态配置器){
stateConfigurer.state(状态);
如果(!childStateList.isEmpty()){
forEach(childState->stateConfigurer.parent(state).initial(childState).state(childState));
}
}
私有void addTransaction(生成器、TransProp-TransProp){
试一试{
if(null!=transProp){
if(StringUtils.isBlank(transProp.getGuard())){
builder.configureTransitions().withExternal().source(transProp.getSource())
.target(transProp.getTarget()).event(transProp.getEvent());
}否则{
builder.configureTransitions().withExternal().source(transProp.getSource())
.target(transProp.getTarget()).guard(new BaseGuard()).event(transProp.getEvent());
}
}
}捕获(例外e){
logger.error(“配置状态时出错”,e);
新的运行时异常(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();
}
});
}
}
private void configureState(字符串状态、列表子状态列表、,
状态配置器(状态配置器){
stateConfigurer.state(状态);
如果(!childStateList.isEmpty()){
childStateList.forEach(childState->{
试一试{
stateConfigurer.and().withStates().parent(state)、initial(childState)、state(childState);
}捕获(例外e){
e、 printStackTrace();
}
});
}
}
有关更多信息,请参阅谢谢你,瓦库,这正是我要找的。