如何处理@ViewScoped页面中的“缓存”实例?

时间:2018-08-06 11:11:29

标签: java jpa caching eclipselink

运行JSFPrimefaceseclipselink的应用,不是一个小应用,大约100页/ bean都可以正常运行

在了解@ViewScoped页面的工作方式时遇到了一些麻烦,我得到了一个select UI组件,其中包含一个简单的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,更改第3个人(删除car,保存在数据库中(在数据库中签入))
  • 回到peoplePage.xhtml,列表确定,调试中的IDs#650, #651, #652
  • 更改 selectUI 的值(来自null)以选择人员,在断点处,p似乎是#412元素,因此它的车清单上的更改是不可见的,它不是来自listPpl(因为它仅包含有效元素并且对应于DB),因此属于缓存

我试图禁用 ecpliselink 缓存为状态EclipleLink cache

  • 更改 eclipselink 属性
  • 更改 JPA 属性
  • 使用@Cacheable(false)

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

我认为@ViewScoped允许每次都打开页面,好像是第一次一样,但似乎不行,无法弄清楚可以在哪里存储/缓存元素


编辑我暂时使用了一种解决方法,但这显然是最好的解决方案

public People setSelectedPeople(People p){    
    if(p!=null)
        selectedPeople = sPeople.read(p.getId());                         
}

1 个答案:

答案 0 :(得分:0)

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

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

  

@RequestScoped   只要HTTP请求-响应存在,Bean就会存在。它是根据HTTP请求创建的,并在与HTTP请求关联的HTTP响应完成时被销毁。

     

@ViewScoped   只要用户与浏览器窗口/选项卡中的同一JSF视图进行交互,Bean就会存在。它是根据HTTP请求创建的,一旦用户回传到另一个视图,它就会被销毁。

描述来源:https://www.tutorialspoint.com/jsf/jsf_managed_beans.htm