RichFaces portlet and h:selectOneMenu
portletbridgefrankum May 9, 2008 5:15 AMHello,
I've been developing a set of portlets for the 2.6.4 Portal Server, and recently am trying to integrate RichFaces components. I have a portlet that renders properly when using static (defined in the xhtml file) menu items, but when I try to read from a managed bean I get the following error (stack trace snipped):
Cause: javax.portlet.PortletException: Error process faces request Message: Error process faces request StackTrace: javax.portlet.PortletException: Error process faces request at javax.portlet.faces.GenericFacesPortlet.doFacesDispatch(GenericFacesPortlet.java:303) at javax.portlet.faces.GenericFacesPortlet.doView(GenericFacesPortlet.java:263) at javax.portlet.GenericPortlet.doDispatch(GenericPortlet.java:133) at javax.portlet.faces.GenericFacesPortlet.doDispatch(GenericFacesPortlet.java:244) (snip) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) at java.lang.Thread.run(Unknown Source) javax.portlet.faces.BridgeException: Error processing render lifecycle at org.jboss.portletbridge.ExceptionHandlerImpl.processRenderException(ExceptionHandlerImpl.java:59) at org.jboss.portletbridge.AjaxPortletBridge.doFacesRequest(AjaxPortletBridge.java:281) at javax.portlet.faces.GenericFacesPortlet.doFacesDispatch(GenericFacesPortlet.java:300) at javax.portlet.faces.GenericFacesPortlet.doView(GenericFacesPortlet.java:263) (snip) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) at java.lang.Thread.run(Unknown Source) javax.faces.FacesException: java.lang.IllegalArgumentException: Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectOne(provider). Found null. at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:306) at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144) at org.jboss.portletbridge.AbstractAjaxBridge.render(AbstractAjaxBridge.java:137) at org.jboss.portletbridge.AjaxPortletBridge.renderResponse(AjaxPortletBridge.java:305)
My page looks like this:
<?xml version="1.0" ?> <jsp:root version="2.0" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:rich="http://richfaces.org/rich"> <jsp:directive.page contentType="text/html" /> <jsp:output omit-xml-declaration="no" doctype-root-element="html" doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN" doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" /> <f:view> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>Portlet Input1</title> </head> <body> <f:loadBundle var="bundle" basename="com.intersoftkk.foo.jsfbeans.resources.i18n.messages" /> <h:form> <rich:tabPanel selectedTab="searchList" switchType="client"> <rich:tab name="preferences" label="prefs"> <h:panelGrid columns="3"> <h:panelGroup> <h:outputText styleClass="portlet-msg-error" value=" * " /> <h:outputLabel value="#{bundle.menu_provider}" for="provider" /> </h:panelGroup> <h:selectOneMenu id="provider"> <!-- value="#{tableDataBean.providerId}"> --> <f:selectItems value="#{testBean.items}" /> <f:selectItem itemLabel="aa" itemValue="aa"/> </h:selectOneMenu> <h:message for="provider" styleClass="error-message" showSummary="true" showDetail="false" /> <h:panelGroup> <h:outputText styleClass="portlet-msg-error" value=" * " /> <h:outputLabel value="#{bundle.menu_service}" for="service" /> </h:panelGroup> <h:selectOneMenu id="service" > <f:selectItem itemLabel="bb" itemValue="cc"/> </h:selectOneMenu> <h:message for="service" styleClass="error-message" showSummary="true" showDetail="false" /> </h:panelGrid> </rich:tab> <rich:tab name="searchList" label="search"> <span style="text-align: right"> <h:commandButton id="display" action="displayValues" value="#{bundle.DISPLAY_PROMPT}" styleClass="portlet-form-button" /> </span> </rich:tab> </rich:tabPanel> </h:form> </body> </html> </f:view> </jsp:root>
If I comment out the testBean.items line, the page renders.
The appropriate managed bean method is
public SelectItem[] getItems() { SelectItem[] ret = new SelectItem[1]; ret[0] = new SelectItem(1,"label"); return ret; }
I'd appreciate any help. The error messages are less than clear, and searching through the forums showed lots of guesswork. The component demo I downloaded doesn't seem to use a selectOneMenu, and I was trying to avoid incorporating Seam if I don't have to (trying to KISS but it's difficult).
The included libraries in the project include:
commons-beanutils-core.jar
commons-digester-1.8.jar
jsf-facelets.jar
commons-lang-2.3.jar
richfaces-impl-3.2.0.GA.jar
richfaces-ui-3.2.0.GA.jar
portletbridge-impl-1.0.0B2.jar
portletbridge-api-1.0.0B2.jar
commons-collections-3.2.jar
commons-beanutils-1.7.0.jar
jsf-facelets-1.1.14.jar
(and I just realized that I may have collisions with the last two)
I've tried to write the config files following the wiki's advice. I can include them later if needed. I'd appreciate some advice on the selectOne/selectMany components in the RichFaces context.
--Richard Frankum