Недавно мне было поручено перенести существующее приложение (используя 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?