【问题标题】:org.primefaces.component.datatable.DataTable cannot be cast to MyEntityorg.primefaces.component.datatable.DataTable 不能转换为 MyEntity
【发布时间】:2013-11-20 15:00:02
【问题描述】:

我正在试验 DataTable - 单元格编辑,如 PrimeFaces showcase 所示,我想保存修改后的对象 方法onCellEdit定义如下:

public void onCellEdit(CellEditEvent event) {  
       Object oldValue = event.getOldValue();  
       Object newValue = event.getNewValue();
       Matpilotaccess mpltiacc = (Matpilotaccess)event.getSource();
       articleDAO.Updatetable(mpltiacc);
       //event.getSource();
       System.out.println("///////////////////////"+event.getOldValue());
       System.out.println("///////////////////////"+event.getNewValue());
}

Matpilotaccess 类定义如下:

@Entity
@Table(name="matpilotaccess")
public class Matpilotaccess implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name="idmatpilotaccess1")
    private int idmatpilotaccess1;
    @Column(name="serie")
    private String serie;
    @Column(name="cap")
    private int cap;
    @Column(name="cal")
    private String cal;
    @Column(name="classe")
    private int classe;
    @Column(name="unite")
    private String unite;
    @Column(name="puhtva")
    private float puhtva;

    @Column(name="puttc")
    private float puttc;
    @Column(name="quantite")
    private float quantite;
    @Column(name="monthtva")
    private float monthtva;
    @Column(name="montttc")
    private float montttc;


    public Matpilotaccess1(int idmatpilotaccess1, String serie, int cap,
            String cal, int classe, String unite, float puhtva, float puttc,
            float quantite, float monthtva, float montttc) {
        super();
        this.idmatpilotaccess1 = idmatpilotaccess1;
        this.serie = serie;
        this.cap = cap;
        this.cal = cal;
        this.classe = classe;
        this.unite = unite;
        this.puhtva = puhtva;
        this.puttc = puttc;
        this.quantite = quantite;
        this.monthtva = monthtva;
        this.montttc = montttc;
    }
    public Matpilotaccess1() {
        super();
    }

    //getters and setters



}

并抛出以下异常:

org.primefaces.component.datatable.DataTable cannot be cast to com.pfe.model.Matpilotaccess

如何继续将 primefacesDatatable 转换为 Matpilotaccess(我的实体)?

【问题讨论】:

  • event.getSource() 会返回一个DataTable,你为什么要把它转换成你自己的类型?
  • @JamesB 因为我想用修改后的对象替换旧对象
  • 您已经使用 getNewValue() 检索了新值。您需要在保存之前将其设置到您的自定义类中。你能发布 Matpilotaccess 课程吗?
  • 是的,您可以在编辑后的问题中找到它..

标签: jsf jsf-2 primefaces datatable


【解决方案1】:

“用修改后的对象替换旧对象”意味着更新一个实体对象而不是更新整个实体(数据表),所以这应该足够了:

public void onCellEdit(CellEditEvent event) {  
    ...
    FacesContext context = FacesContext.getCurrentInstance();
    Matpilotaccess mpltiacc  = context.getApplication().evaluateExpressionGet(context, "#{mpltiacc}", Matpilotaccess.class);  
    articleDAO.Updatetable(mpltiacc);
    ...
}

【讨论】:

  • 我怀疑 event.getNewValue() 将返回一个字符串,它是 Matpilotaccess 的属性之一的值。只有 OP 才能证实这个想法。
  • 它似乎返回Object.. 我宁愿指的是第一次修改属性而不是实体对象。感谢您指出这一点。
  • 您是否调试过应用程序以查看运行时实际返回的类型?
  • @Omar 它抛出了这个错误java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.String 并且错误来自String new_serie = (String) event.getNewValue();
  • @JamesB 是的,它返回对象
猜你喜欢
  • 1970-01-01
  • 2019-02-26
  • 2018-02-10
  • 2023-03-22
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多