Проблема с динамическим состоянием действия - PullRequest
0 голосов
/ 09 мая 2011

У меня проблема с Spring Webflow.XML-определение моего потока:

<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/webflow
        http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd" parent="changeLang">

    <input name="hash" required="true"/>

    <action-state id="decideAction">
        <set name="flowScope.goTo" value ="verifyActionService.verifyHash(hash)" />
        <transition to="${goTo}" ></transition> 
    </action-state>

    <view-state id="correctVerify" view="registered" model="userAddressesForm">
        <transition on="addPhoneNumber" to="correctVerify">
            <evaluate expression="verifyActionService.addPhoneNumber(userAddressesForm)" />
        </transition>
        <transition on="deletePhoneNumber" to="correctVerify">
            <evaluate expression="verifyActionService.deletePhoneNumber(userAddressesForm, requestParameters.deleteNumber)" />
        </transition>
    </view-state>

    <view-state id="notCorrectVerify" view="register"></view-state>

</flow>

Метод verifyHash возвращает идентификатор состояния, равный «correctVerify», например:

public String verifyHash(String hash) {
    return "correctVerify";
}

Когда я его запускаю, выдается ошибка, подобная этой:

at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.IllegalArgumentException: Cannot find state with id '${goTo}' in flow 'verify' -- Known state ids are 'array<String>['decideAction', 'correctVerify', 'notCorrectVerify', 'start']'
at org.springframework.webflow.engine.Flow.getStateInstance(Flow.java:348)
at org.springframework.webflow.engine.support.DefaultTargetStateResolver.resolveTargetState(DefaultTargetStateResolver.java:60)
at org.springframework.webflow.engine.Transition.execute(Transition.java:217)
at org.springframework.webflow.engine.impl.FlowExecutionImpl.execute(FlowExecutionImpl.java:391)
at org.springframework.webflow.engine.impl.RequestControlContextImpl.execute(RequestControlContextImpl.java:214)
at org.springframework.webflow.engine.TransitionableState.handleEvent(TransitionableState.java:119)

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 09 мая 2011

Атрибут to для transition принимает строковый литерал. Если вы хотите объединить строковые литералы и EL, вам нужно использовать шаблонное выражение:

<transition to="#{goTo}"/>

Информация о двух различных типах выражения может быть найдена в этом разделе документации.

Кроме того, вы уверены, что вам нужно возвращать имя состояния просмотра из вашего сервисного уровня? Общий шаблон для <action-state> состоит в том, что вы вызываете метод, используя <evaluate>, а затем определяете различные переходы в разные состояния на основе результата <evaluate> ... аналогично оператору switch. Взгляните на этот раздел о состояниях действия.

...