我有一点问题:当我退出我的cms时,SOMEHOW调用我的一个参数的setter并执行动作。它导致http500。
具体一点:我使用以下命令将参数从jsf页传递给backing(@RequestScoped)bean:
<f:metadata>
<f:viewParam name="activate" value="#{myManagedBean.activate}" />
它使用setter,它在数据库中进行更改:
public void setActivate(int num) {
ab.changeActiveState("myString", num);
return;
}
logout方法用于完全不同的bean,并调用简单方法:
public String logout() {
Object request = FacesContext.getCurrentInstance().getExternalContext().getRequest();
HttpServletRequest a = (HttpServletRequest) request;
try {
a.logout();
} catch(Exception e) {
logger.info("Error while logout: " + e);
}
return "advert-list.xhtml?faces-redirect=true";
}
注销抛出错误:
javax.servlet.ServletException: javax.el.ELException: /secure/my-list.xhtml @12,81 value="#{myManagedBean.activate}": javax.ejb.EJBException: javax.persistence.NoResultException: No entity found for query
javax.faces.webapp.FacesServlet.service(FacesServlet.java:321) org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349)
root cause
javax.faces.component.UpdateModelException: javax.el.ELException: /secure/advert-list.xhtml @12,81 value="#{myManagedBean.activate}": javax.ejb.EJBException:
javax.persistence.NoResultException: No entity found for query
javax.faces.component.UIInput.updateModel(UIInput.java:848)
javax.faces.component.UIViewParameter.updateModel(UIViewParameter.java:284)
javax.faces.component.UIInput.processUpdates(UIInput.java:730)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1109)
javax.faces.component.UIComponentBase.processUpdates(UIComponentBase.java:1109)
javax.faces.component.UIViewRoot.processUpdates(UIViewRoot.java:1218) com.sun.faces.lifecycle.UpdateModelValuesPhase.execute(UpdateModelValuesPhase.java:74)
com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97)
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) org.apache.myfaces.webapp.filter.ExtensionsFilter.doFilter(ExtensionsFilter.java:349)
我不知道发生了什么,为什么。关于那个setter - 它应该工作。关于注销 - 从我的项目中的任何其他页面,它不会抛出任何东西并注销当前用户。
答案 0 :(得分:0)
与getter方法一样,您根本不应该在setter方法中执行业务逻辑。
如果您打算在<f:viewParam>
完成其工作后对初始请求执行操作,那么您应该使用<f:event type="preRenderView">
侦听器方法。
<f:metadata>
<f:viewParam name="activate" value="#{myManagedBean.activate}" />
<f:event type="preRenderView" listener="#{myManagedBean.init}" />
</f:metadata>
与
private int num;
public void init() {
if (!FacesContext.getCurrentInstance().isPostback()) {
ab.changeActiveState("myString", num);
}
}
public void setActivate(int num) {
this.num = num;
}
请注意,即将推出的JSF 2.2将被<f:viewAction onPostback="false">
替换。
答案 1 :(得分:0)
也许不是最好的,但是解决这个问题的方法是在setter中添加if语句:
if (!FacesContext.getCurrentInstance().isPostback()) {
ab.changeActiveState("myString", num);
}
如果你知道其他任何政治上更正确的方法,请告诉我。
顺便说一下 - 我试图以其他方式传递参数,但它们都不起作用。在Mykong页面上阅读了一些内容(1),在评论中我发现其中一些方法不适用于请求范围内的bean ......