PrimeFaces向导未重置

时间:2014-03-17 10:14:44

标签: jsf jsf-2 primefaces

我们在Tomcat 7上使用PrimeFaces 4.0 + spring 4.

我去PrimeFaces展示案例,打开向导,输入第一个名字和姓氏点击下一个按钮。然后我从左侧面板中选择其他菜单(如AutoComplete)我返回向导,名字和姓氏字段清晰。这就是我的预期。

我开发了一个与上面相同的向导,但每次回到向导页面时,向导仍保留先前输入的值,并且不会重置。

我的托管bean如下(我使用了文档中提到的ViewScoped没有SessionScope):

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@Named
@ViewScoped
public class AccountController {

     @Valid
     private Account account = new Account()

     //Setters and getters    
}

编辑:

我发现问题出在JSF和Spring的集成上。当我删除@Named并使用@ManagedBean时,它可以正常工作。有什么意见吗?!

1 个答案:

答案 0 :(得分:1)

Spring没有对JSF ViewScope的内置支持,但您可以将此范围添加到JSF中:

public class ViewScope implements Scope {

    public Object get(String name, ObjectFactory<?> objectFactory) {
        Map<String, Object> viewMap = FacesContext.getCurrentInstance()
                .getViewRoot().getViewMap();

        if (viewMap.containsKey(name)) {
            return viewMap.get(name);
        } else {
            Object object = objectFactory.getObject();
            viewMap.put(name, object);

            return object;
        }
    }

    public Object remove(String name) {
        return FacesContext.getCurrentInstance().getViewRoot().getViewMap()
                .remove(name);
    }

    public String getConversationId() {
        return null;
    }

    public void registerDestructionCallback(String name, Runnable callback) {
        // Not supported
    }

    public Object resolveContextualObject(String key) {
        return null;
    }
}

请参阅http://blog.primefaces.org/?p=702

applicationConetext.xml

<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
        <entry key="view">
                <bean class="utils.ViewScope" />
        </entry>
        </map>
    </property>
</bean>

最后:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@Named
@ViewScoped
@Scope("view")
public class AccountController {

     @Valid
     private Account account = new Account()

     //Setters and getters    
}