java.lang.ClassCastException:java.util.HashMap无法强制转换为ClassObject

时间:2014-05-29 21:45:53

标签: spring jsf primefaces

我在PrimeFaces中遇到<p:dataTable>问题,我找不到错误。

Class UsuarioAsig:

public class UsuarioAsig {

private BigDecimal codigopersona;
private String nombre;
private String paterno;
private String materno;
private String login;
private String observacion;
private String tipocontrol;
private String externo;
private String habilitado;
private String nombreperfil;
private BigDecimal codigousuario;  ...get and set...}

Class UsuarioAsigListaDataModel:

public class UsuarioAsigListaDataModel  extends ListDataModel<UsuarioAsig> implements SelectableDataModel<UsuarioAsig> {
public UsuarioAsigListaDataModel(){}
public UsuarioAsigListaDataModel(List<UsuarioAsig> data){super(data);}
@Override
public UsuarioAsig getRowData(String rowKey) {
    @SuppressWarnings("unchecked")
    List<UsuarioAsig> listaUsuarioAsigLectura = (List<UsuarioAsig>) getWrappedData();
    for (UsuarioAsig usuarioAsig : listaUsuarioAsigLectura) {
        if (usuarioAsig.getCodigopersona().equals(rowKey)) { return usuarioAsig; }
    }
    return null;
}
@Override
public Object getRowKey(UsuarioAsig usuarioAsig) {
    return usuarioAsig.getCodigopersona();
}}

控制器UsuarioAsigController:

@Controller("usuarioAsigController")
@Scope(value = "session")
public class UsuarioAsigController {

    private List<UsuarioAsig> listaUsuarioAsig;
    private HashMap<String, Object> selUsuarioAsig;
    private UsuarioAsigListaDataModel mediumUsuarioAsigModel;
    @Autowired
    UsuarioService usuarioService;

    ...

    public List<UsuarioAsig> getListaUsuarioAsig() {
        listaUsuarioAsig = usuarioService.selectAsig();
        return listaUsuarioAsig;
    }

    public void setListaUsuarioAsig(List<UsuarioAsig> listaUsuarioAsig) {
        this.listaUsuarioAsig = listaUsuarioAsig;
    }

    public void setMediumUsuarioAsigModel(UsuarioAsigListaDataModel mediumUsuarioAsigModel) {
        this.mediumUsuarioAsigModel = mediumUsuarioAsigModel;
    }

    public UsuarioAsigListaDataModel getMediumUsuarioAsigModel() {
        listaUsuarioAsig = usuarioService.selectAsig();
        mediumUsuarioAsigModel = new UsuarioAsigListaDataModel(listaUsuarioAsig);
        return mediumUsuarioAsigModel;
    }

    public void onRowSelect(SelectEvent event) {
        FacesMessage msg = new FacesMessage("Usuario seleccionado", ((UsuarioAsig) event.getObject()).getNombre());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }
}

单击其中一行数据表时会生成错误:

asiginst.xhtml:

<h:form id="form">
    <p:growl id="msgs" showDetail="true" />

    <p:dataTable id="usuarioAsigListaDataModel" var="usuarioAsig"
        value="#{usuarioAsigController.mediumUsuarioAsigModel}"
        rowKey="#{usuarioAsig.codigopersona}"
        selection="#{usuarioAsigController.selUsuarioAsig}"
        selectionMode="single" paginator="true" rows="10">
        <p:ajax event="rowSelect"
            listener="#{usuarioAsigController.onRowSelect}"
            update=":form:msgs" />
        <p:column headerText="Código" style="width:10%">#{usuarioAsig.codigopersona}</p:column>
        <p:column headerText="Nombre" style="width:32%">#{usuarioAsig.nombre}</p:column>
        <p:column headerText="Apellidos" style="width:32%">#{usuarioAsig.paterno} #{usuarioasig.materno}</p:column>
        <p:column headerText="Tipo Control" style="width:20%">#{usuarioAsig.tipocontrol}</p:column>
        <p:column headerText="Habilitado" style="width:6%">#{usuarioAsig.habilitado}</p:column>
    </p:dataTable>
</h:form>

产生错误:

WARNING: asiginst.xhtml @51,103 listener="#{usuarioAsigController.onRowSelect}": java.lang.ClassCastException: java.util.HashMap cannot be cast to com.datos.entidades.qry.UsuarioAsig
javax.el.ELException: asiginst.xhtml @51,103 listener="#{usuarioAsigController.onRowSelect}": java.lang.ClassCastException: java.util.HashMap cannot be cast to com.datos.entidades.qry.UsuarioAsig
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:111)
    at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processArgListener(AjaxBehaviorListenerImpl.java:69)
    at org.primefaces.behavior.ajax.AjaxBehaviorListenerImpl.processAjaxBehavior(AjaxBehaviorListenerImpl.java:56)
    at org.primefaces.event.SelectEvent.processListener(SelectEvent.java:40)
    at javax.faces.component.behavior.BehaviorBase.broadcast(BehaviorBase.java:102)
    at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:760)
    at javax.faces.component.UIData.broadcast(UIData.java:1071)
    at javax.faces.component.UIData.broadcast(UIData.java:1093)
    at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
    at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
    at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
    at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
    at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.ClassCastException: java.util.HashMap cannot be cast to com.datos.entidades.qry.UsuarioAsig
    at com.controller.UsuarioAsigController.onRowSelect(UsuarioAsigController.java:217)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
    at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
    at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
    ... 29 more

2 个答案:

答案 0 :(得分:1)

我假设HashMap<String, Object> selUsuarioAsig是您的选择。

然后在方法

public void onRowSelect(SelectEvent event) {
    FacesMessage msg = new FacesMessage("Usuario seleccionado", ((UsuarioAsig) event.getObject()).getNombre());
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

您正在尝试将HashMap强制转换为UsuarioAsig:((UsuarioAsig) event.getObject())

答案 1 :(得分:0)

作为http://www.primefaces.org/showcase/ui/data/datatable/selection.xhtml的示例,在其他表中没有生成错误,经过多次测试后错误是mybatis mapper,因为resulMap是Map类型。