Область должна быть добавлена ​​в родительский класс компонента поддержки, в противном случае создается исключение javax.faces.application.ViewExpiredException. - PullRequest
0 голосов
/ 14 февраля 2020

Недавно мне было поручено перенести существующее приложение (используя myfaces 2 и primefaces 5) из Tomcat (JDK 1.7) в JBoss (openJDK 1.8). В конечном итоге приложение удалось запустить, и мне удалось добраться до страницы входа и успешно войти в систему.

После входа в систему будет вызван класс SidebarBacking. Этот класс SidebarBacking расширяет класс AbstractBean (без определения области) и внедряет AppContextBean для меню.

package com.myapp.pkg1.web.mbean.common;

@ManagedBean
@SessionScoped
public class SidebarBacking extends AbstractBean
{
    ....

    @ManagedProperty(value="#{appcontextbean}")
    AppContextBean appContextBean;

    public void setAppContextBean(AppContextBean appContextBean) {
        this.appContextBean = appContextBean;
    }

    public AppContextBean getAppContextBean() {
        return appContextBean;
    }

    @PostConstruct
    public void init()
    {
        MenuParser.getInstance().setParentStyle("ui-state-default");
        MenuParser.getInstance().setChildStyle("ui-sidebar-menuitem-child");
        root = MenuParser.getInstance().generateMenuTree(authorities(), getAppContextBean().getMenu(),true);
    }

    ....
}
package com.myapp.pkg1.web.mbean.common;

@ManagedBean(name="appcontextbean", eager=true)
@ApplicationScoped
public class AppContextBean implements Serializable
{
    ...
    private Menu menu;
    private final String menuPath = "/xml/menu.xml";

    public AppContextBean() {
        if(menu == null){
            try {
                this.menu = MenuBuilder.getInstance().loadMenuFromClassPath(menuPath);
            } catch (JAXBException e) {
                throw new SystemException(e.getMessage(), e.getCause());
            } catch (SAXException e) {
                throw new SystemException(e.getMessage(), e.getCause());
            } catch (IOException e) {
                throw new SystemException(e.getMessage(), e.getCause());
            }
        }
    }

    public Menu getMenu() {
        return menu;
    }

    public void setMenu(Menu menu) {
        this.menu = menu;
    }

    public String getMenuPath() {
        return menuPath;
    }
}
package com.myapp.pkg2.web.mbean;

public class AbstractBean implements Serializable
{
    ...

    protected FacesContext facesContext() {
        return (FacesContext.getCurrentInstance());
    }

    protected ExternalContext externalContext() {       
        if (facesContext() != null)
            return facesContext().getExternalContext();
        else
            return null;
    }

    protected SecurityContext securityContext(){
        return SecurityContextHolder.getContext();
    }

    protected WebApplicationContext webApplicationContext() {
        return FacesContextUtils.getWebApplicationContext(facesContext());
    }

    protected HttpServletRequest request() {
        return (HttpServletRequest) externalContext().getRequest();
    }

    protected HttpSession session() {
        return (HttpSession) externalContext().getSession(false);
    }

    protected ServletResponse response() {
        return (ServletResponse) externalContext().getResponse();
    }

    protected void forward(String uri) throws ServletException, IOException {
        RequestDispatcher dispatcher = request().getRequestDispatcher(uri);
        dispatcher.forward(request(), response());
    }

    protected void redirect(String uri) throws IOException {
        externalContext().redirect(uri);
    }

    protected String getRequestParameter(String key) {
        return request().getParameter(key);
    }

    protected void putSessionAttribute(String key, Object value) {
        externalContext().getSessionMap().put(key, value);
    }

    protected Object getSessionAttribute(String key) {
        return externalContext().getSessionMap().get(key);
    }

    protected Object removeSessionAttribute(String key) {
        return externalContext().getSessionMap().remove(key);
    }

    protected void addInfoMessage(String clientId, String text)
    {
        facesContext().addMessage(clientId, new FacesMessage(FacesMessage.SEVERITY_INFO, text, text));
    }

    ....
}

При успешном входе в систему я вижу боковое меню и главное страница со всей таблицей данных, извлеченных из базы данных. Проблема заключается в том, что, когда я нажимаю на любую ссылку меню, появляются следующие исключения:

940 SEVERE [org.omnifaces.exceptionhandler.FullAjaxExceptionHandler] (default task-1) FullAjaxExceptionHandler: An exception occurred during processing JSF ajax request. Error page '/faces/pages/common/login.xhtml' will be shown.: javax.faces.application.ViewExpiredException: /pages/inbox/myInbox.xhtmlNo saved view state could be found for the view identifier: /pages/inbox/myInbox.xhtml
        at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:132)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:170)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:197)
        at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
        at com.myapp.pkg2.web.cache.NoCacheFilter.doFilter(NoCacheFilter.java:40)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at com.myapp.pkg2.web.logging.LogFilter.doFilter(LogFilter.java:33)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
        at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
        at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:64)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:183)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
        at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
        at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
        at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at io.opentracing.contrib.jaxrs2.server.SpanFinishingFilter.doFilter(SpanFinishingFilter.java:55)
        at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
        at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
        at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
        at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
        at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
        at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
        at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
        at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
        at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
        at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
        at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
        at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
        at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
        at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
        at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
        at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
        at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
        at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)
        at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)
        at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)
        at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)
        at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
        at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
        at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1504)
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1504)
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1504)
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1504)
        at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1504)
        at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
        at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)
        at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)
        at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)
        at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
        at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
        at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
        at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
        at java.lang.Thread.run(Thread.java:748)
994 SEVERE [org.omnifaces.exceptionhandler.FullAjaxExceptionHandler] (default task-1) FullAjaxExceptionHandler: An exception occurred during rendering JSF ajax response. Error page '/faces/pages/common/errorPage.xhtml' will be shown.: java.lang.IllegalStateException: Must be called before the start element is closed (attribute 'autocomplete')
    ....

Я прочитал, что это означает, что область действия уже истекла, когда вы открываете страницу. Я могу разрешить исключение, если я добавлю область в класс AbstractBean, однако это вызовет проблему.

Всякий раз, когда обновляются какие-либо данные, хотя база данных обновляется успешно, данные по всему веб-сайту по-прежнему не обновляются до самой последней информации. Данные остаются в последнем состоянии при первом получении. Только когда я выйду из системы и войду снова, только новые данные будут отражены.

package com.myapp.pkg2.web.mbean;

@ManagedBean(name = "abstractBean")
@SessionScoped
public class AbstractBean implements Serializable
{
    ....

Я также попытался поиграть с несколькими вариантами для p: commandButton, но безуспешно

<p:commandButton id="btnAssign" value="Assign" action="#{myInbox.assignWork}" update="@all" />
<p:commandButton id="btnAssign" value="Assign" action="#{myInbox.assignWork}" update="@form" />
<p:commandButton id="btnAssign" value="Assign" action="#{myInbox.assignWork}" update="dataTable" />
<p:commandButton id="btnAssign" value="Assign" action="#{myInbox.assignWork}" update=":form:dataTable" />
<p:commandButton id="btnAssign" value="Assign" action="#{myInbox.assignWork}" process="@all" update="dataTable" />

Проблема, по-видимому, связана с областью, которая была добавлена ​​к AbstractBean, поскольку все компоненты поддержки (например, MyInboxBacking) расширяют класс AbstractBean. Поэтому, даже если они имеют свою собственную область (например, @RequestScoped, @ViewScoped), они не вступят в силу из-за области действия родительского класса.

Таким образом, как я могу удалить область из AbstractBean, не вызывая Установлено исключение, или я могу как-то обновить sh данные даже с @Sessionscoped?

...