注销服务时未初始化的方法入侵



我有一个小问题:注销我的 cms 时,不知何故调用了我的一个参数的设置器并执行了操作。它的结果是 http500。

具体来说:我使用以下方法将参数从 jsf 页面传递到支持 (@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)

我不知道发生了什么,为什么。关于那个二传手 - 它应该工作。关于注销 - 从我项目的任何其他页面,它不会抛出任何内容并注销当前用户。

就像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"> 取代的

另请参阅:

  • <f:metadata>、<f:viewParam> 和 <f:viewAction> 可以用来做什么?

也许不是最好的,但解决这个问题的工作方法是在setter中添加if语句:

if (!FacesContext.getCurrentInstance().isPostback()) {
    ab.changeActiveState("myString", num);
}

如果您知道任何其他更政治正确的方法,请告诉我。

顺便说一句 - 我试图以其他方式传递参数,但它们都不起作用。 在 Mykong 页面 (1) 上阅读了一些内容,在评论中我发现其中一些方法不适用于请求范围的 bean......

米孔页面

最新更新