如何在@ViewScoped页面中处理'缓存'实例?

azr*_*zro 6 java caching jpa eclipselink

应用程序与运行JSF,Primefaces,eclipselink,而不是一个小的应用程序,约100页/豆的所有工作完美

我在理解我的@ViewScoped页面工作方式时遇到了一些麻烦,我得到了一个selectUI组件,在我的bean中填充了一个简单List<People>的后端selectedPeople


// all getters, setters, JPA annotations, all good
public class People {
    private String name;
    private List<Car> cars;
}
Run Code Online (Sandbox Code Playgroud)
@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
    }
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

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

  • peoplePage.xhtml选择元素的位置,IDs列表的元素是#410, #411, #412(3人)
  • 转到modif.xhtml,更改第3个人(删除a car,保存在DB中(检入DB))
  • 回来peoplePage.xhtml,列表可以,IDs在调试中#650, #651, #652
  • 更改selectUI的值(from null)以选择一个人,并且在断点处,似乎是元素,因此其汽车列表中的更改不可见,它不来自(因为只包含有效元素和对应)到DB),这是一种缓存p#412listPpl

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

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

没有人有效果,也没有去私人导航也没有清除浏览器缓存并回到页面,p元素仍然是从第一次加载的旧元素

我想@ViewScoped允许每次打开一个页面,好像它是第一次,但似乎没有,无法计算元素可以存储/缓存的位置


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

public People setSelectedPeople(People p){    
    if(p!=null)
        selectedPeople = sPeople.read(p.getId());                         
}
Run Code Online (Sandbox Code Playgroud)

Has*_*ash 1

您正在寻找的是@RequestScoped. 每次您发出合适的 HTTP 请求时,它都会创建所有内容。否则不能保证@ViewScoped豆子被破坏。Omnifaces 文档中的示例:ViewScoped

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

@RequestScoped Bean 的生命周期与 HTTP 请求响应的生命周期相同。它根据 HTTP 请求创建,并在与 HTTP 请求关联的 HTTP 响应完成时销毁。

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

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