【问题标题】:PrimeFaces deleting a row from DataTable absurd errorPrimeFaces 从 DataTable 中删除一行荒谬错误
【发布时间】:2013-01-14 20:53:04
【问题描述】:

我正在使用一个 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 类是一个简单的 POJO 类,由 IDE 生成,无需贴。问题是当方法被调用时,它会抛出一个 java.lang.IllegalArgumentException: Cannot convert model.Dobavljac[ dobavljacID=66 ] of type class model.Dobavljac to class model.Dobavljac 这很荒谬,因为传递的对象与MB 方法“obrisi(Dobavljac d)”。 当然,对象永远不会从数据库中删除,因为方法没有被调用。我的想法是这是一个 PrimeFaces 问题,而不是 JSF 问题之一。

我找到了和这个非常相似的例子,发现没有人出现过这种问题(同类之间的转换),不需要实现转换器。

我不确定是否需要在问题中添加更多信息,如果能提供答案,我将不胜感激。这很烦人。谢谢!

【问题讨论】:

    标签: jsf-2 primefaces datatable managed-bean


    【解决方案1】:
    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中的所有类文件、/WEB-INF/lib中的所有JAR文件、服务器/lib中的所有JAR文件、JRE的/lib/lib/ext中的所有JAR文件。服务器可以通过特定的配置设置添加其他文件夹。具体如何以及具体取决于服务器的品牌/版本,而您没有透露任何信息。

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

    【讨论】:

    • 感谢您的超快速响应!我仔细检查了我所有的文件夹/包中的双重类条目,但事实并非如此。我忘了提到我使用的是 GlassFish 3+,我将其配置为仅使用特定的数据库连接,没有额外的文件夹。在几次重建、部署、取消部署操作后,问题(最终)消失了。我遇到的例外并不容易理解。另外,作为初学者,我有一个快速的问题:在更改代码或添加新库、资源时,在 NetBeans 中“运行”、部署、构建等的最佳实践是什么?再次感谢!
    • 显然它在 Netbeans 或 Glassfish 缓存中的某个地方。抱歉,我不能代表 Netbeans,我只是使用 Eclipse(与 JRebel 一起加速热部署)。
    • @BorkoS 您可以使用 Netbeans 的热部署属性来查看浏览器中代码的变化。为此,请右键单击您的 netbeans 项目并选择属性。从属性窗格中选择 Build 菜单下的 Compile 菜单。从此菜单中为属性“Compile on Save”选择“For both application and test execution”。这将使 netbeans 能够在您每次保存后将您的更改部署到 glassfish 服务器。
    • @cubbuk 感谢您的建议,我已经在使用该选项。显然,我有在整个项目上点击“运行”的坏习惯,我认为这会将所有内容传输到服务器,而不仅仅是差异。我最近才开始使用 JavaEE,从常规桌面应用程序转移。
    • 不客气 =) 在开发过程中要小心 javascript 文件和 css 文件。因为当您对这些文件进行更改时,有时您需要清理浏览器的缓存以查看更改,当您需要处理 javascript 时,这会导致烦人的情况。
    猜你喜欢
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 2015-11-13
    • 1970-01-01
    相关资源
    最近更新 更多