我正在尝试遵循“Spring in Action”中的 Spring Webflow 代码。但是,当我尝试运行该应用程序时,出现以下错误:
org.springframework.webflow.engine.FlowInputMappingException: Errors occurred during input mapping on startup of the 'pizza' flow; errors = [[RequiredError@13cb4078 mapping = order -> flowScope.order, code = 'required', error = true, errorCause = [null], originalValue = [null], mappedValue = [null]]]
我相信在以下流 xml 中实例化订单对象的行是导致异常的原因:
<var name="order" class="com.mycompany.pizza.domain.Order" />
<subflow-state id="customer" subflow="customer-flow">
<input name="order" value="order"/>
<transition on="customerReady" to="buildOrder" />
</subflow-state>
我的子流 xml 如下所示:
<view-state id="welcome">
<transition on="phoneEntered" to="lookupCustomer" />
</view-state>
<action-state id="lookupCustomer">
<evaluate result="order.customer"
expression="pizzaFlowActions.lookupCustomer(requestParameters.phoneNumber)" />
<transition to="registrationForm"
on-exception="com.mycompany.pizza.service.CustomerNotFoundException" />
<transition to="customerReady" />
</action-state>
希望有人能给我指出正确的方向。谢谢!
最佳答案
该错误表示您需要将 NOT NULL 输入参数/obj“order”传递给您的子流程,并且您在 order 输入中传递了 null 值。因此,如果未提供,它将引发您看到的异常。子流程的顶部应如下所示:
<input name="order" required="true" type="com.mycompany.pizza.domain.Order"/>
话虽这么说,一般来说,我认为在流/子流之间传递 pojo 时,最好非常明确地填写子流调用者和子流本身的输入标记中的“type”属性,并填写 value 属性的范围前缀(例如 flowScope.order)
此外,我认为你的问题是 <var>
标签没有初始化您的订单 pojo,这就是它为空的原因,它相当于:
Order order = null;
您应该使用父流程开头的“on-start”标签内的“set”标签,通过 new 运算符或工厂方法调用显式设置 flowScope.order。像这样的事情:
<on-start>
<set name="flowScope.order" value="new com.mycompany.pizza.domain.Order()"/>
<!-- for development purposes... assuming you are using log4j grab the logger and check that order is in fact NOT null -->
<evaluate expression="T(org.apache.log4j.Logger).getLogger('someLogger').info(flowScope.order)"/>
</on-start>
然后(仍在父流程中)将子流程调用更改为如下所示:
<subflow-state id="customer" subflow="customer-flow">
<input name="order" value="flowScope.order" type="com.mycompany.pizza.domain.Order"/>
<transition on="customerReady" to="buildOrder" />
</subflow-state>
并且...确保您还填写了 subflow.xml 的输入标记内的 type 属性,如下所示:
<input name="order" required="true" type="com.mycompany.pizza.domain.Order"/>
关于java - 在 Spring Webflow 中映射对象时出现 FlowInputMappingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31010940/