Cast Problem I dont understand ... Converter / SelectItems
paper Feb 16, 2006 4:28 PMI tried to merge a Converter and a List to have one flexible component to use for different Entity-Classes to be used in a JSF-Select. I no get populated the List once, but abfter I get te following Exception:
22:23:04,392 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception java.lang.ClassCastException: java.util.ArrayList at javax.faces.component.UIOutput.restoreState(UIOutput.java:92) at javax.faces.component.UIInput.restoreState(UIInput.java:384) at javax.faces.component.html.HtmlSelectOneMenu.restoreState(HtmlSelectOneMenu.java:406) at javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:511) at javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:502) at javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:502) at org.apache.myfaces.application.jsp.JspStateManagerImpl.restoreComponentState(JspStateManagerImpl.java:129) at org.apache.myfaces.application.jsp.JspStateManagerImpl.restoreView(JspStateManagerImpl.java:185) at org.jboss.seam.jsf.SeamPhaseListener$StateManagerInterceptor.restoreView(SeamPhaseListener.java:205) at org.apache.myfaces.application.jsp.JspViewHandlerImpl.restoreView(JspViewHandlerImpl.java:255) at com.sun.facelets.FaceletViewHandler.restoreView(FaceletViewHandler.java:319) at org.apache.myfaces.lifecycle.LifecycleImpl.restoreView(LifecycleImpl.java:124) at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:66) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:106) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.seam.servlet.SeamRedirectFilter.doFilter(SeamRedirectFilter.java:23) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.jboss.web.tomcat.security.CustomPrincipalValve.invoke(CustomPrincipalValve.java:54) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:174) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:74) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.MasterSlaveWorkerThread.run(MasterSlaveWorkerThread.java:112) at java.lang.Thread.run(Thread.java:595)
I've the following Code:
package org.termtimer.controller;
import static org.jboss.seam.InterceptionType.ALWAYS;
import static org.jboss.seam.ScopeType.CONVERSATION;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.ejb.Interceptors;
import javax.ejb.Remove;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.ConverterException;
import javax.faces.model.SelectItem;
import org.jboss.logging.Logger;
import org.jboss.seam.annotations.Create;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Intercept;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.ejb.SeamInterceptor;
import org.termtimer.model.Lookup;
@Scope(CONVERSATION)
@Name("flexSelectItems")
@Interceptors(SeamInterceptor.class)
@Intercept (ALWAYS)
public class FlexSelectItemsBean extends LinkedList<SelectItem>
implements List<SelectItem>, javax.faces.convert.Converter{
private static final long serialVersionUID = -1611564525004318869L;
private static final Logger log = Logger.getLogger(FlexSelectItemsBean.class);
private Map<String, Object> items;
public FlexSelectItemsBean() {
super();
items = new HashMap<String, Object>();
log.info("SelectItemArrayList(c) called"+this);
}
public FlexSelectItemsBean(Collection<SelectItem> c) {
super(c);
items = new HashMap<String, Object>();
log.info("SelectItemArrayList(c) called"+this);
}
public void convertIn(List list) {
log.info("convertIn() called"+this);
Iterator i = list.iterator();
this.clear();
while(i.hasNext()){
log.info("outer while");
Object o = i.next();
try{
log.info("inner while");
Lookup l = (Lookup) o;
SelectItem item = new SelectItem(o, l.getShowName());
items.put(l.getKey(), o);
this.add(item);
}catch(Exception E){
log.info("Exception");
}
}
log.info("size:"+this.size());
}
@Create
public void create(){
log.info("create() called"+this);
}
@Destroy @Remove
public void destroy() {
log.info("destroy() called"+this);
}
//Converter Methods
public Object getAsObject(FacesContext arg0, UIComponent arg1, String str) throws ConverterException {
log.info("getAsObject() called"+this);
if(items.containsKey(str)){
return items.get(str);
}
return null;
}
public String getAsString(FacesContext arg0, UIComponent arg1, Object obj) throws ConverterException {
log.info("getAsString() called"+this);
if(obj instanceof Lookup){
Lookup l = (Lookup)obj;
log.info("ausgabe: "+l.getKey()+" "+l.getShowName());
return l.getKey();
}
return null;
}
}
In the SFSB which controls the view, I inject the "flexSelectItems", fill it an outject it.
@In(value="flexSelectItems" ,create=true) @Out public FlexSelectItemsBean flexSelectItems; flexSelectItems.convertIn(facultyAPI.getAll());
<div class="input">
<h:selectOneMenu id="facult" value="lecturer.faculty" converter="#{flexSelectItems}">
<f:selectItems value="#{flexSelectItems}" />
</h:selectOneMenu>
</div>I see that this is a strange concept, but I'd like to know where the Problem lies. Tried a lot and am thankful fur any help.
Dennis