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, #652null)以选择一个人,并且在断点处,似乎是元素,因此其汽车列表中的更改不可见,它不来自(因为只包含有效元素和对应)到DB),这是一种缓存p#412listPpl我试图禁用ecpliselink缓存作为状态EclipleLink缓存
@Cacheable(false)没有人有效果,也没有去私人导航也没有清除浏览器缓存并回到页面,p元素仍然是从第一次加载的旧元素
我想@ViewScoped允许每次打开一个页面,好像它是第一次,但似乎没有,无法计算元素可以存储/缓存的位置
编辑我暂时使用了一种解决方法,但这显然是最好的解决方案
public People setSelectedPeople(People p){
if(p!=null)
selectedPeople = sPeople.read(p.getId());
}
Run Code Online (Sandbox Code Playgroud)
您正在寻找的是@RequestScoped. 每次您发出合适的 HTTP 请求时,它都会创建所有内容。否则不能保证@ViewScoped豆子被破坏。Omnifaces 文档中的示例:ViewScoped。
例如,当用户使用浏览器的后退和前进按钮时,此功能可用于帮助重新创建页面。
@RequestScoped Bean 的生命周期与 HTTP 请求响应的生命周期相同。它根据 HTTP 请求创建,并在与 HTTP 请求关联的 HTTP 响应完成时销毁。
只要用户与浏览器窗口/选项卡中的同一 JSF 视图进行交互, @ViewScoped Bean 就会存在。它根据 HTTP 请求创建,并在用户回发到不同视图时被销毁。
描述来源:https://www.tutorialspoint.com/jsf/jsf_management_beans.htm
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |