java.lang.IllegalStateException: родитель не был нулевым, но этот компонент не связан - PullRequest
3 голосов
/ 06 января 2011

У меня есть следующее исключение во время запуска программы JSF.

    org.apache.jasper.JasperException: An exception occurred processing JSP page /pages/general/internalServerErrorPage.jsp at line 44

    41:             <link rel="shortcut icon" href="<%=request.getContextPath()%>/resources/images/infomindzicon.ico" type="image/x-icon" />
    42:         </head>
    43:         <body id="sscmsMainBody">
    44:             <h:form id="internalServerErrorPageForm" binding="#{ServerErrorBean.initForm}">
    45:                 <rich:page id="richPage" theme="#{LayoutSkinBean.layoutTheme}"
    46:                            width="#{LayoutSkinBean.layoutScreenWidth}"
    47:                            sidebarWidth="0">
Caused by: javax.servlet.ServletException: javax.servlet.jsp.JspException: java.lang.IllegalStateException: Parent was not null, but this component not related
    at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
    at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
    at org.apache.jsp.pages.general.internalServerErrorPage_jsp._jspService(internalServerErrorPage_jsp.java:207)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)

Что означает это исключение и как я могу разрешить это?


Обновление : мой код указан ниже,

public HtmlForm getInitForm() {
    validateSession();
    return initForm;
}

Метод проверки сеанса

private void validateSession() {        
    HttpSession session = null;
    try {
        FacesContext facesContext = FacesContext.getCurrentInstance();
        actionPanelRendered = false;
        if (facesContext != null) {
            session = (HttpSession) facesContext.getExternalContext().getSession(false);            
            if (session != null) {
                if (session.getAttribute(SessionAttributes.USER_LOGIN_NAME.getName()) != null) {
                    actionPanelRendered = true;
                }
            }
        }
    } catch(Exception e) {
        logger.info("Exception arise in server error bean");
        e.printStackTrace();
    }
}

1 Ответ

5 голосов
/ 06 января 2011

Это происходит из следующей строки:

<h:form id="internalServerErrorPageForm" binding="#{ServerErrorBean.initForm}">

Вы связали форму с бином по неизвестной причине.Исключение указывает, что у этого компонента есть родительский элемент, но на самом деле это , а не родительский элемент в соответствии с деревом компонентов на странице JSP.Это, в свою очередь, указывает на то, что вы делаете что-то вроде следующего в bean-компоненте до или во время вызова метода getInitForm():

form.setParent(someComponent);

Если это так, то вам следует удалить эту строку.*


Обновление : еще одна возможная причина заключается в том, что вы забыли поместить <f:view> вокруг HTML с компонентами JSF.


Обновление 2: Еще одна причина заключается в том, что вы привязываете несколько и физически различных компонентов <h:form> к одному и тому же свойству компонента.Каждый из них должен быть привязан к своему собственному уникальному свойству (или, в данном случае, вообще не должен быть связан, это можно сделать лучше, см. Ниже).


Не имеет отношения к проблеме, какvalidateSession метод, весь метод может быть упрощен до следующего единственного выражения EL в представлении:

rendered="#{not empty user.name}"

при условии, что SessionAttributes.USER_LOGIN_NAME равно user.

...