Webflow视图状态模型bean属性未自动装配

时间:2015-02-14 05:16:19

标签: spring-webflow-2

我有一个Spring 3.2.11和Webflow 2.4.0应用程序,使用JSF2进行视图渲染。

我的一个页面使用视图状态模型bean进行验证,但是当调用validatePasswordChange方法时,bean属性尚未自动装配,因此我获得了NPE。我不明白为什么他们是空的??

感谢您提出任何建议。

这是我的bean验证方法。为什么passwordService属性为null?

public void validatePasswordChange(ValidationContext context) {

    MessageContext messages = context.getMessageContext();
    if (!confirmPassword.equals(newPassword)) {

        messages.addMessage(new MessageBuilder().error()
                .source("confirmPassword")
                .defaultText(
                        this.getMessage("kyn.password.change.validation.noMatch"))
                .build());
    };

    List<String> validationMessages = passwordService
            .validatePasswordPolicyCompliance(getUsername(),
            newPassword);
    if (validationMessages != null) {
        for (String message : validationMessages) {
            messages.addMessage(new MessageBuilder().error()
                    .source("confirmPassword")
                    .defaultText(message).build());
        }
    }
}

这是我的flow.xml的一个片段。我在开始时将passwordUpdateBean插入到flowScope中,并期望model属性使用它:

<on-start>
    <evaluate expression="passwordUpdateBean" result="flowScope.passwordUpdateBean"></evaluate>
</on-start>

<view-state id="passwordChange" model="passwordUpdateBean">
    <transition on="proceed" to="update"/>
    <transition on="cancel" to="redirectCancel"  validate="false"/>
</view-state>

这是我的bean config xml:

<bean id="passwordUpdateBean"
    class="com.xyz.PasswordUpdateBean"
    scope="prototype"
    parent="abstractWebBean">
    <property name="passwordService" ref="passwordManagementService"/>  
    <property name="appUserDetailsService" ref="appUserDetailsService"/>
    <property name="autoLoginAfterEnrollment" value="true"/>
    <property name="usernamePasswordAuthenticationProvider" ref="usernamePasswordAuthenticationProvider"/>
</bean>

1 个答案:

答案 0 :(得分:0)

bean 将不会自动连接您的流定义。您必须将bean显式检索到流定义中。

注意 @Service 类注释可在流文件中自动访问(i.e <evaluate expression="myService.getPasswordUpdateBean()" result="flowScope.passwordUpdateBean"/>)

<on-start>
    <evaluate expression="....getPasswordUpdateBean()" result="flowScope.passwordUpdateBean"></evaluate>
    <!-- where '....' = either @service class or some other obj that holds a reference to the bean you seek --> 
</on-start>