PrimeFaces从DataTable中删除一行荒谬的错误

时间:2013-01-14 20:53:05

标签: jsf-2 primefaces datatable managed-bean

我正在使用DataTable组件,我非常直接的目标是使用内联命令按钮删除行。这是dataTable组件的代码。

        <p:dataTable rowKey="#{dobavljac.dobavljacID}" value="#{dobavljacMB.vratiDobavljace()}" var="dobavljac" >
            <p:column>
                <f:facet name="header">ID</f:facet>
                <h:outputText value="#{dobavljac.dobavljacID}" />
            </p:column>
            <p:column>
                <f:facet name="header">Naziv</f:facet>
                <h:outputText value="#{dobavljac.naziv}" />
            </p:column>
            <p:column>
                <f:facet name="header">Adresa</f:facet>
                <h:outputText value="#{dobavljac.adresa}" />
            </p:column>

            <p:column colspan="2" style="text-align: center">
                <f:facet name="header">Operacija</f:facet>
                <p:commandButton id="viewButton" style="height: 35px" value="Delete" action="#{dobavljacMB.obrisi(dobavljac)}" ajax="false"/>          
            </p:column>
        </p:dataTable>

“dobavljac”是我需要删除的实体 action =“#{dobavljacMB.obrisi(dobavljac)}”

具有删除功能“obrisi”的托管bean类如下:

/**
 * Creates a new instance of DobavljacMB
 */
private Dobavljac tekuci;

public Dobavljac getTekuci() {
    return tekuci;
}

public void setTekuci(Dobavljac tekuci) {
    this.tekuci = tekuci;
}



public DobavljacMB() {
}

public String prikazDobavljaca() {

    System.out.println("Prikaz dobavljaca");
    // System.out.println("podaci su:"+tekuciKorisnik.getKorisnickoIme());



    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Ne postoji korisnik sa tim korisnickim imenom i sifrom!", ""));
    return null;
}

public List<Dobavljac> vratiDobavljace() {

    return KonekcijaDB.vratiInstancu().vratiDobavljace();

}

public String obrisi(Dobavljac d){
    try {
        System.out.println("obrisi");
        KonekcijaDB.vratiInstancu().obrisi(d);
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Dobavljac obrisan", ""));
        return "prikazDobavljaca.xhtml";
    } catch (Exception e) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Greska pri brisanju", ""));
        return "prikazDobavljaca.xhtml";
    }


    }

Dobavljac类是一个由IDE生成的简单POJO类,因此无需发布它。问题是,当调用该方法时,它会抛出一个 java.lang.IllegalArgumentException:无法将类型为model.Dobavljac的model.Dobavljac [dobavljacID = 66]转换为类model.Dobavljac ,这是非常荒谬的,因为传递的对象与中的对象相同MB方法“obrisi(Dobavljac d)”。 当然,永远不会从DB中删除该对象,因为不会调用该方法。我的想法是,这是一个PrimeFaces问题,而不是JSF之一。

我发现了与此非常相似的示例,发现没有人遇到过这种问题(相同类之间的转换),并且不需要实现转换器。

我不确定是否需要在问题中添加更多信息,我非常感谢您的回答。这很烦人。谢谢!

1 个答案:

答案 0 :(得分:0)

java.lang.IllegalArgumentException: Cannot convert model.Dobavljac[ dobavljacID=66 ]
      of type class model.Dobavljac to class model.Dobavljac

webapp的运行时类路径很脏。 model.Dobavljac类有多个类文件定义,每个定义由不同的ClassLoader加载。 webapp的运行时类路径默认涵盖/WEB-INF/classes中的所有类文件,所有JAR文件/WEB-INF/lib,服务器/lib中的所有JAR文件,JRE /lib和{{中的所有JAR文件1}}。服务器可以通过特定配置设置添加其他文件夹。如何以及哪个完全取决于您没有告诉任何事情的服务器的品牌/版本。

清理运行时类路径并删除重复的类文件定义(只是独立的/lib/ext文件或包含有问题的.class文件的JAR文件)。重建/重新部署/重启后,此问题应该消失。