我升级到Mojarra JSF 2.2.1(从2.1.22开始),从那时起我的每个请求都在控制台中出现异常:
GRAVE: JSF1094: Could not decode flash data from incoming cookie value /?.
Processing will continue, but the flash is unavailable for this request.
com.sun.faces.lifecycle.InvokeApplicationPhase execute
Run Code Online (Sandbox Code Playgroud)
当我没有使用闪存范围时,请求成功完成.但是,因为我正在使用此范围FacesMessages,如果我在此处输入消息,我有一个NullPointerException并且导航流程被中断:
GRAVE: El Servlet.service() para servlet Faces Servlet lanzó una excepción
java.lang.NullPointerException
at com.sun.faces.context.flash.ELFlash.loggingGetPhaseMapForWriting(ELFlash.java:803)
at com.sun.faces.context.flash.ELFlash.setKeepMessages(ELFlash.java:323)
at org.omnifaces.util.Messages.addFlash(Messages.java:460)
at org.omnifaces.util.Messages.addFlashInfo(Messages.java:488)
at com.company.view.utils.FacesUtils.addInfoMessage(FacesUtils.java:91)
at com.company.view.utils.FacesUtils.addInfoMessage(FacesUtils.java:79)
at com.company.view.beans.navegable.detectables.generic.NavegableDetectableAddGeneric.save(NavegableDetectableAddGeneric.java:92)
at com.company.view.beans.navegable.detectables.generic.NavegableDetectableAddGeneric.actionSave(NavegableDetectableAddGeneric.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87)
at …Run Code Online (Sandbox Code Playgroud) 我使用flash scope在@viewscoped控制器之间传递一个设置对象.但是如果我在其中一个页面上重新加载页面,则flash地图为空,并且设置对象未初始化.是否可以在页面重新加载时保持闪存范围?
我的源代码存储/检索设置:
FistPage.xhtml
...
<p:commandButton value="next"
action="#{firstPageController.transferConfig}"
process="@this" />
...
Run Code Online (Sandbox Code Playgroud)
FirstPageController.java
@ManagedBean(name = "firstPageController")
@ViewScoped
public class FirstPageController {
...
public String transferConfig() {
FacesContext.getCurrentInstance().getExternalContext().getFlash().put("searchConfig", searchConfig);
return "/secondPage.xhtml?faces-redirect=true";
}
...
}
Run Code Online (Sandbox Code Playgroud)
SecondPage.xhtml
...
<h:outputLabel value="value">
<f:event type="preRenderComponent" listener="#{secondPageController.onPageLoad()}"/>
</h:outputLabel>
...
Run Code Online (Sandbox Code Playgroud)
SecondPageController.java
@ManagedBean(name = "secondPageController")
@ViewScoped
public class SecondPageController {
...
public void onPageLoad()
{
flash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
searchConfig = ((SearchFilterConfig) flash.get("searchConfig"));
flash.putNow("searchConfig", searchConfig);
flash.keep("searchConfig");
}
...
}
Run Code Online (Sandbox Code Playgroud)
我使用Mojarra 2.1.29
谢谢
我已经阅读了范围(@SessionScoped, @ViewScoped, @ApplicationScope and @RequestScope)类型之间的所有差异,但是,我仍然在某种程度上遇到应用程序问题。我有一个page-1 与网格和我所选择的项目发送到page-2(两者page-1并page-2用相同的支持bean),以进行编辑,然后持续存在。据我所知,我的托管bean正在使用@RequestScoped,javax.faces.bean.RequestScoped这是理想的使用范围,但是它不起作用,bean被破坏了,数据丢失了。
恢复该故事,我将注释更改为@SessionScoped并且可以正常工作,但是我想知道这是否是一个好习惯?因为我已经读到,使用这种方法不是一个好习惯,@SessionScoped因为在客户端注销之前数据将一直保持活动状态。