1

我在 weblogic server 12c 上运行的 web 应用程序中使用 myfaces 2.1.10 faces 引擎和 open faces 3.1 (openfaces-3.1.EA1.1198.jar)。Web 应用程序使用 facelets 模板来加载页眉/内容/页脚页面 (.xhtml)。

在内容页面中,我放置了一个输入文本字段以及一个搜索按钮以及 openfaces 的数据表。当我输入要搜索的文本然后通过单击搜索按钮时,系统会返回一些数据并填充我放置在同一页面中的 openfaces 数据表组件,但是当我再次尝试搜索时,我收到了如下粘贴的异常。我相信这个问题是由 openfaces 数据表引起的,因为当我用 jsf 数据表替换时,一切正常。我必须使用 openfaces 数据表,因为它适合我对分页、过滤等的要求。

对于 Clarity,我将粘贴来自 web.xml 和内容页面 (roleMaintenance.xhtml) 的代码片段。

提前感谢您的所有帮助和支持。

网页.xml:

<context-param>
<description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
        <param-value>client</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
        <param-value>.xhtml</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
        <param-value>true</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
        <param-value>false</param-value>
    </context-param>
    <context-param>
        <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
        <param-value>/pages/roleMaintenance.xhtml</param-value>
    </context-param>
    <listener>
        <listener-class>com.sun.faces.config.ConfigureListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

角色维护.xhtml:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:t="http://myfaces.apache.org/tomahawk"
xmlns:o="http://openfaces.org/">
<ui:composition
template="/resources/common/templates/rsaMasterTemplate.xhtml">
<ui:define name="content">
<f:view>
<table width="100%">
<tr>
<td>
<table width="50%"><tr>
<td><h:outputLabel styleClass="fieldLabelText"
value="#{message['application.common.label.searchBy']}"/>
</td>

<td><h:selectOneMenu class="entryfieldText"
value="#{securityRoleMaintenanceManagedBean.selectedSearchCriteria}">
<f:selectItem itemValue="Role" itemLabel="Role" />
<f:selectItem itemValue="Desc" itemLabel="Desc" />
</h:selectOneMenu></td>

<td><h:inputText size="30" class="entryfieldText"
value="#{securityRoleMaintenanceManagedBean.searchValue}">
</h:inputText></td>

<td><h:commandLink
action="#{securityRoleMaintenanceManagedBean.search}"
styleClass="buttonOrange">
<span><h:outputText
value="#{message['application.common.button.search']}" /></span>
</h:commandLink></td>
<td class="cellSpacer"></td>

<td colspan="5"><o:dataTable id="dTbl_RM"
value="#{securityRoleMaintenanceManagedBean.roleDtos}"
var="role" rowIndexVar="rowIndex"
horizontalGridLines="1px solid gray"
verticalGridLines="1px solid gray">
<o:scrolling autoScrollbars="true" />
<o:row condition="#{rowIndex%2 == 0}"
styleClass="standardTable_Row2" />
<o:column>
<f:facet name="header">
<h:outputText
value="#{message['application.security.roleadmin.label.role']}"
styleClass="scrollerTable headerText" />
</f:facet>
<h:outputText align="center" value="#{role.role}"
styleClass="scrollerTable cellText" />
</o:column>
<o:column>
<f:facet name="header">
<h:outputText
value="#{message['application.security.roleadmin.label.description']}"
styleClass="scrollerTable headerText" />
</f:facet>
<h:outputText align="center" value="#{role.description}"
styleClass="scrollerTable cellText" />
</o:column>
<o:column>
<f:facet name="header">
<h:outputText
value="#{message['application.common.label.actions']}"
styleClass="scrollerTable headerText" />
</f:facet>

<table>
<tr>
<td><h:commandLink
actionListener="#{securityRoleMaintenanceManagedBean.displayEditRole}"
value="#{message['application.common.link.edit']}"
styleClass="scrollerTable cellText">
<f:attribute name="selection" value="#{role}" />
</h:commandLink></td>

<td class="cellSpacer"></td>
<td class="cellSpacer"></td>
<td>
<div>
<h:commandLink
onclick="if (! confirm('Really delete this?') ) { return false;}; return true; "
actionListener="#{securityRoleMaintenanceManagedBean.deleteRole}"
value="#{message['application.common.link.delete']}"
styleClass="scrollerTable cellText">
<f:attribute name="selection" value="#{role}" />
</h:commandLink>

</div>
</td>
</tr>
</table>
</o:column>
</o:dataTable></td>
</tr>
</table>
</h:panelGroup></td>
</tr>
</table>
</td>
</tr>

</table>
</f:view>
</ui:define>
</ui:composition>
</html>

错误打印堆栈跟踪

   java.lang.InstantiationException: com.sun.faces.facelets.compiler.UIInstructions
at java.lang.Class.newInstance0(Class.java:340)
at java.lang.Class.newInstance(Class.java:308)
at   com.sun.faces.application.StateManagerImpl.newInstance(StateManagerImpl.java:296)
at com.sun.faces.application.StateManagerImpl.restoreTree(StateManagerImpl.java:326)
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:203)
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:453)
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:192)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:116)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:216)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:132)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:338)
at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:25)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
at org.openfaces.util.ResourceFilter.doFilter(ResourceFilter.java:41)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:27)
at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:74)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3288)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3254)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2163)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2089)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1513)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:256)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)
4

1 回答 1

1

此错误是由禁用的部分状态保存引起的。如果您从web.xml

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>
<context-param>
    <param-name>javax.faces.FULL_STATE_SAVING_VIEW_IDS</param-name>
    <param-value>/pages/roleMaintenance.xhtml</param-value>
</context-param>

那么理论上它应该可以工作。

这本质上是 OpenFaces 中的一个错误。它以某种方式强制进入非瞬态状态,而它必须是瞬态的。RichFaces 4.2.0 以前有过这样的错误,此 JBoss 社区线程中有详细说明。另请参阅以下相关摘录:

因此,在编码期间 - 的所有子级UIOutputPanel都设置为非瞬态(甚至UIInstructions类型的节点)。

解决方法:

public class UIOutputPanelWorkaround extends UIOutputPanel
{
  public boolean isKeepTransient() {
    Boolean value = (Boolean) getStateHelper().eval(Properties.keepTransient, false);
    return value;
  }
}

并在faces-config

  <component>
    <component-type>org.richfaces.OutputPanel</component-type>
    <component-class>com.example.UIOutputPanelWorkaround</component-class>
  </component>

似乎此错误已作为问题 206报告给 OpenFaces ,但似乎没有任何进展。您可能想要评论/投票以推动它。或者只是重新打开部分状态保存。无论您想通过禁用部分状态保存来解决什么问题,都可能需要以不同的方式解决。

于 2013-01-18T11:16:18.303 回答