代码之家  ›  专栏  ›  技术社区  ›  azro

如何处理@ViewScoped page中的“cached”实例?

  •  6
  • azro  · 技术社区  · 8 年前

    应用程序运行方式 JSF Primefaces , eclipselink

    我很难理解 @ViewScoped 页面工作,我得到一个 select List<People> 还有一个后端 selectedPeople


    // all getters, setters, JPA annotations, all good
    public class People {
        private String name;
        private List<Car> cars;
    }
    

    @ManagedBean
    @ViewScoped
    public class PeopleBean {
        @EJB
        private Service sPeople;
        private People selectedPeople;
        private List<People> listPpl;
    
        @PostConstruct
        public void init(){
            listPpl = sPeople.readAll();      // always good, same as DB values
        }
    
        public People getSelectedPeople(){
           return selectedPeople;
        }
    
        public People setSelectedPeople(People p){     // p is an old element
           selectedPeople = p;                         // BREAKPOINT
        }
    
        // getter for the list too
        public void method(){
            Logger.getAnoymousLogger().severe(selectedPeople.getCars()); // the one the old people, not the ne contained in the actual list
        }
    }
    

    <p:selectOneMenu id="selectP" value="#{peopleBean.selectedPeople}" converted="#{genericSecuerdConverter}" >
        <p:ajax event="change" partialSubmit="true" listener="#{peopleBean.method()}" />
        <f:selectItems value="#{peopleBean.listPpl}" var="people" itemLabel="#{people.name}" itemValue="#{people}" />
    </p:selectOneMenu>
    

    使用顺序和问题是(从调试中获取的信息):

    • peoplePage.xhtml 在select元素所在的位置, IDs 列表元素的 #410, #411, #412 (3人)
    • modif.xhtml ,更改第三个人(删除 car ,保存在数据库中(签入数据库)
    • peoplePage.xhtml文件 ,列表正常, 身份证 在调试中 #650, #651, #652
    • 更改值(从 null )的 选择界面 p 似乎是 #412 listPpl (因为只包含有效的元素并对应于DB),所以它是一种缓存

    我试着让自己失去能力 埃普利塞林 缓存为状态 EclipleLink cache

    • 改变 财产
    • 改变 日本航空公司 房地产
    • 使用 @Cacheable(false)

    没有人起作用,也没有人进入私人导航,也没有人清除浏览器缓存并返回到页面 第页 元素仍然是第一次加载时的旧元素

    @视域 允许每次打开一个页面,就好像这是第一次一样,但似乎不知道元素可以存储/缓存在哪里


    我暂时用了一个变通办法,但这显然是最好的解决办法

    public People setSelectedPeople(People p){    
        if(p!=null)
            selectedPeople = sPeople.read(p.getId());                         
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Hash Santosh Kumar Arjunan    8 年前

    你要找的是 @RequestScoped . 它将在每次您执行适当的HTTP请求时创建所有内容。否则不能保证 @ViewScoped 豆。Omnifaces文档中的一个示例: ViewScoped

    例如,当用户使用浏览器的后退和前进按钮时,此功能可用于帮助重新创建页面。

    @请求范围 Bean的生命周期与HTTP请求响应的生命周期一样长。它根据HTTP请求创建,并在与HTTP请求关联的HTTP响应完成时被销毁。

    @视域 只要用户在浏览器窗口/选项卡中与同一个JSF视图交互,Bean就会存在。它根据HTTP请求创建,并在用户回发到其他视图时被销毁。

    说明来源: https://www.tutorialspoint.com/jsf/jsf_managed_beans.htm