java.lang.ClassCastException: java.util.Collections$UnmodifiableMap cannot be cast to Param

jacekczaplin

I'm trying to write converter to my selectonemenu where I wan't to select object. My object ("Param") class looks like this:

public class Param {
private Integer id;
private String name;

public Param(Integer id, String name){
    this.id = id;
    this.name = name;
}

public Integer getId(){
    return this.id;
}
public String getName(){
    return this.name;
}

@Override
public boolean equals(Object object) {
    return (object instanceof Param) && (id != null) 
         ? id.equals(((Param) object).getId()) 
         : (object == this);
}

@Override
public int hashCode() {
    return (id != null)
        ? (this.getClass().hashCode() + id.hashCode())
        : super.hashCode();
}

}

Bean:

@ManagedBean
@SessionScoped
public class MainBean {
private List<Param> params;
private Param selectedParam;


public List<Param> getParams(){
    return this.params;
}
public Param getSelectedParam(){
    return this.selectedParam;
}
public void setSelectedParam(Param param){
    this.selectedParam = param;
}


public MainBean(){
    //filling params - works good
}

}

Converter (I know ther should be null checks and stuff):

@FacesConverter(value = "paramConverter", forClass = Param.class)
public class ParamConverter implements Converter {
private List<Param> getParams(){
    ExternalContext tmpEC;
    Map sMap;
    tmpEC = FacesContext.getCurrentInstance().getExternalContext();
    sMap = tmpEC.getSessionMap();
    MainBean mainBean = (MainBean) sMap.get("mainBean");
    return mainBean.getParams();
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value)
{
    Integer id = Integer.valueOf(value);
    List<Param> params = this.getParams();
    Param param = null;
    for(int i=0; i < params.size(); i++){
        if(id == params.get(i).getId()){
            param = params.get(i);
            break;
        }
    }
    return param;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value)
{
    Param param = (Param)value;
    return String.valueOf(param.getId());
}

}

SelectOneMenu:

<h:selectOneMenu value="#{mainBean.selectedParam}">
<f:converter converterId="paramConverter" />
<f:selectItems value="#{mainBean.params}"
var="param" 
itemValue="#{param}" 
itemLabel="#{param.name}" 
/>
</h:selectOneMenu>

Tomcat output:

HTTP Status 500 - java.util.Collections$UnmodifiableMap cannot be cast to Param

--------------------------------------------------------------------------------

type Exception report

message java.util.Collections$UnmodifiableMap cannot be cast to Param

description The server encountered an internal error that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: java.util.Collections$UnmodifiableMap cannot be cast to Param
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:659)


root cause 

java.lang.ClassCastException: java.util.Collections$UnmodifiableMap cannot be cast to Param
    ParamConverter.getAsString(ParamConverter.java:40)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.getFormattedValue(HtmlBasicRenderer.java:521)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderOption(MenuRenderer.java:534)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderOptions(MenuRenderer.java:794)
    com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:847)
    com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:297)
    javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:919)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1903)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:304)
    com.sun.faces.renderkit.html_basic.GroupRenderer.encodeChildren(GroupRenderer.java:115)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1896)
    javax.faces.render.Renderer.encodeChildren(Renderer.java:176)
    javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:889)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1896)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
    javax.faces.component.UIComponent.encodeAll(UIComponent.java:1899)
    com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:451)
    com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
    com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:120)
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:219)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:647)

I gues that getAsString method gets UnmodifiableMap object as value, but it should be Param object, am I right?

Please help me

Ps. Sorry about my english if I did some mistakes ;P

BalusC

The problem is here in the var attribute.

<f:selectItems value="#{mainBean.params}"
    var="param" 
    itemValue="#{param}" 
    itemLabel="#{param.name}" 
/>

The #{param} is a reserved EL variable referring the ServletRequest#getParameterMap() which is of type Map<String, String[]> and indeed an unmodifiable map.

You shouldn't be using reserved EL variable names for own variables. Rename it to something else, e.g. _param or so.

<f:selectItems value="#{mainBean.params}"
    var="_param" 
    itemValue="#{_param}" 
    itemLabel="#{_param.name}" 
/>

Your converter, albeit a bit clumsy and not entirely robust, is totally fine.

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

java.lang.ClassCastException: java.util.Collections$UnmodifiableMap cannot be cast to Param

From Dev

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast

From Dev

java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList

From Dev

java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.Map$Entry

From Dev

How to fix: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Integer

From Dev

java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String

From Dev

java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer in DAO

From Dev

How to fix: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Integer

From Dev

java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer

From Dev

Class cast Exception: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long

From Dev

How to fix: java.lang.ClassCastException: java.util.ArrayList cannot be cast to double[]

From Dev

java.lang.ClassCastException: java.util.HashSet cannot be cast to Custom Class

From Java

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account

From Dev

What causes the ClassCastException: java.util.TreeSet cannot be cast to java.lang.Comparable?

From Dev

SDN4: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to [EntityNode]

From Dev

Android HashMap java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.Map$Entry

From Dev

java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String when using Univocity

From Dev

java.lang.ClassCastException: cannot be cast to java.lang.Object

From Dev

UISelectMany in ui:repeat causes java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List

From Dev

deep within JUnit Parameterized test runner: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List

From Dev

UISelectMany in ui:repeat causes java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List

From Dev

parse.com java.lang.ClassCastException: java.util.HashMap cannot be cast to org.json.JSONObject

From Dev

Spring websocket @messagemapping de-serialization issue java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast

From Dev

Hibernate java.lang.ClassCastException: _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy when using Websphere Shared Library

From Dev

Greenfoot: java.lang.ClassCastException: Obstacle cannot be cast to BallProjectile

From Dev

java.lang.ClassCastException: JedisConnectionFactory cannot be cast to ConnectionFactory

From Dev

java.lang.ClassCastException: DTOObject cannot be cast to DTOObject

From Dev

java.lang.ClassCastException: CLASS/Activity cannot be cast to MainActivity

From Dev

ClassCastException: JSONArray cannot be cast to java.lang.String[]

Related Related

  1. 1

    java.lang.ClassCastException: java.util.Collections$UnmodifiableMap cannot be cast to Param

  2. 2

    java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast

  3. 3

    java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList

  4. 4

    java.lang.ClassCastException: java.util.HashMap$EntrySet cannot be cast to java.util.Map$Entry

  5. 5

    How to fix: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Integer

  6. 6

    java.lang.ClassCastException: java.util.HashMap cannot be cast to java.lang.String

  7. 7

    java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer in DAO

  8. 8

    How to fix: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Integer

  9. 9

    java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.lang.Integer

  10. 10

    Class cast Exception: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Long

  11. 11

    How to fix: java.lang.ClassCastException: java.util.ArrayList cannot be cast to double[]

  12. 12

    java.lang.ClassCastException: java.util.HashSet cannot be cast to Custom Class

  13. 13

    java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account

  14. 14

    What causes the ClassCastException: java.util.TreeSet cannot be cast to java.lang.Comparable?

  15. 15

    SDN4: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to [EntityNode]

  16. 16

    Android HashMap java.lang.ClassCastException: java.lang.Integer cannot be cast to java.util.Map$Entry

  17. 17

    java.lang.ClassCastException: java.util.Date cannot be cast to java.lang.String when using Univocity

  18. 18

    java.lang.ClassCastException: cannot be cast to java.lang.Object

  19. 19

    UISelectMany in ui:repeat causes java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List

  20. 20

    deep within JUnit Parameterized test runner: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List

  21. 21

    UISelectMany in ui:repeat causes java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List

  22. 22

    parse.com java.lang.ClassCastException: java.util.HashMap cannot be cast to org.json.JSONObject

  23. 23

    Spring websocket @messagemapping de-serialization issue java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast

  24. 24

    Hibernate java.lang.ClassCastException: _$$_javassist_856 cannot be cast to javassist.util.proxy.Proxy when using Websphere Shared Library

  25. 25

    Greenfoot: java.lang.ClassCastException: Obstacle cannot be cast to BallProjectile

  26. 26

    java.lang.ClassCastException: JedisConnectionFactory cannot be cast to ConnectionFactory

  27. 27

    java.lang.ClassCastException: DTOObject cannot be cast to DTOObject

  28. 28

    java.lang.ClassCastException: CLASS/Activity cannot be cast to MainActivity

  29. 29

    ClassCastException: JSONArray cannot be cast to java.lang.String[]

HotTag

Archive