java - 在 Spring Webflow 中映射对象时出现 FlowInputMappingException

标签 java spring spring-mvc spring-webflow

我正在尝试遵循“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/

相关文章:

java - Android 8 或更高版本 : Check for Google Play Services

java - 构造函数 JSONObject(java.lang.String)

java - 按顺序播放剪辑,并可能与其他剪辑打断(使用javax.sound)

java - 无法从 Spring Boot 应用程序 Autowiring yml 配置类

Java WSDL 修改或隐藏 Web View 上的某些属性

spring-mvc - 源服务器未找到目标的当前表示或不愿透露存在的表示

java - Android TextView Marquee 以编程方式

java - 持久化xml文件与spring boot等效的java配置

Spring 安全: Controller method access to certain roles

spring-mvc - 哪个更好,在 spring3 Controller 上返回 "ModelAndView"或 "String"