java.lang.CclassCastException: org.colfuturo.model.to.PaisTO cannot be cast to org.colfuturo.model.to.PaisTO
deibys Feb 28, 2013 3:56 PMHello Guys,
I am using InfiniSpan to manage a cache which could be managed across several web projects deployed in my JBOSS 7 AS server.
I have defined a container called local-cache in JBOSS console
In that container I have defined a "Local Cached" named combo-cache.
I have a war deployment which only resposibility It is to load the cache in an eagerly way.
@WebServlet(name = "CacheServlet", loadOnStartup = 1) public class CacheServlet extends HttpServlet { /** */ private static final long serialVersionUID = 1L; @Resource(mappedName = "java:jboss/infinispan/local-cache") private org.infinispan.manager.CacheContainer container; private org.infinispan.Cache<String, List<Object>> cacheCombo; private static final Logger logger = Logger.getLogger(CacheServlet.class.getName()); @PersistenceContext(unitName = "entityManager") private EntityManager em; @EJB private IServicioCache bd; @PostConstruct public void initialize() { logger.info("Iniciando init()..."); cacheCombo = container.getCache("combo-cache"); try { cacheCombo.put("paises", bd.getPaises()); } catch (Exception ignored) { cacheCombo.put("paises", null); } logger.info("Finalizando init()..."); } }
As seen in the code, there is one element inserted in the cache "paises" . Even though the cache is defined as List<Object> , It is being inserted List<PaisTO> . I guess the casting is implicitely made
public List<Object> getPaises() throws Exception { logger.info("Iniciando getPaises()..."); List<Object> result = new ArrayList<Object>(); try { final String jpaQLQuery = "SELECT p FROM " + Pais.class.getSimpleName() + " p WHERE p.homologar = false OR p.homologar IS NULL ORDER BY p.favorito DESC, p.nombre"; // jpaQLQuery Query query = em.createQuery(jpaQLQuery); List<Pais> paises = query.getResultList(); for (Pais pais : paises) { //SelectItem si = new SelectItem(pais.getId(), pais.getNombre()); result.add(pais.toPaisTO()); } } catch (Exception ex) { logger.error("Ocurrió un error al consultar los paises....", ex); throw ex; } logger.info("Finalizando getPaises()..."); return result; }
Now I want to access the cache element "paises" from another war deployment in the same jboss as 7 instance. I do it in a SessionScopeBean
@ManagedBean(name = "bean") @SessionScoped public class TestBean { @Resource(mappedName="java:jboss/infinispan/local-cache") private org.infinispan.manager.CacheContainer container; private org.infinispan.Cache<String, List<Object>> cache; List<Object> paises; @PostConstruct public void init() { cache = container.getCache("combo-cache"); paises = cache.get("paises"); if (paises != null) { } } public List<Object> getPaises() { return paises; } public void setPaises(List<Object> paises) { this.paises = paises; }
In the same war , but in another class, I try to access the cache but I get classCastException.
I am trying to downcast from Object to org.colfuturo.model.to.PaisTO ( the exception occurs in the line in orange bellow)
I have to say that PaisTO implements Serializable , and the class is shared across the two projects through a same jar.
The weird thing , It is that this line
System.out.println(o.getClass().getName() + "-" + o.toString());
prints
org.colfuturo.model.to.PaisTO-PaisTO :: [3 - Alemania - null]
which indicates that it should be posible to do the down-casting
@Override public void encodeAll(FacesContext context) throws IOException { pais.setValue(null); List<Object> lista = (List<Object>) getAttributes().get("paises"); List<SelectItem> paisesOpciones = new ArrayList<SelectItem>(); paisesOpciones.add(new SelectItem(null, "Seleccione....")); for (Object o : lista) { System.out.println(o.getClass().getName() + "-" + o.toString()); //if (o instanceof org.colfuturo.model.to.PaisTO) { org.colfuturo.model.to.PaisTO pais = (org.colfuturo.model.to.PaisTO) o; paisesOpciones.add(new SelectItem(pais.getId(), pais.getNombre())); System.out.println(pais.getId() + "-" + pais.getNombre()); //} } setPaises(paisesOpciones); super.encodeAll(context); }
The full stacktrace of the exception :
15:34:32,503 GRAVE [javax.enterprise.resource.webcontainer.jsf.application] (http-localhost-127.0.0.1-8080-1) Error Rendering View[/index2.xhtml]: java.lang.ClassCastException: org.colfuturo.model.to.PaisTO cannot be cast to org.colfuturo.model.to.PaisTO
at component.InputDate.encodeAll(InputDate.java:48) [classes:]
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_33]
15:34:32,519 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/InfinispanWeb].[Faces Servlet]] (http-localhost-127.0.0.1-8080-1) Servlet.service() para servlet Faces Servlet lanzó excepción: java.lang.ClassCastException: org.colfuturo.model.to.PaisTO cannot be cast to org.colfuturo.model.to.PaisTO
at component.InputDate.encodeAll(InputDate.java:48) [classes:]
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1779) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1782) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:125) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.7-jbossorg-2.jar:]
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.7-jbossorg-2.jar:]
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.1.Final.jar:2.0.1.Final]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.13.Final.jar:]
at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:153) [jboss-as-web-7.1.1.Final.jar:7.1.1.Final]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.13.Final.jar:]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:368) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.13.Final.jar:]
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:671) [jbossweb-7.0.13.Final.jar:]
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:930) [jbossweb-7.0.13.Final.jar:]
at java.lang.Thread.run(Unknown Source) [rt.jar:1.6.0_33]
What is the issue ?
Isn´t it possible to put "custom" objects in the cache ?
Does it have to do with that the different deployments may be loaded by different classloaders ?
Any workaround ?