0

私は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]を、渡されたオブジェクトがMBメソッド「obrisi(Dobavljacd)」と同じです。もちろん、メソッドが呼び出されないため、オブジェクトがDBから削除されることはありません。私の考えでは、これはPrimeFacesの問題であり、JSFの問題ではありません。

これに非常によく似た例を見つけましたが、この種の問題(同じクラス間の変換)はなく、コンバーターを実装する必要がないことがわかりました。

質問にさらに情報を追加する必要があるかどうかはわかりません。回答をいただければ幸いです。とても迷惑です。ありがとう!

4

1 に答える 1

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

Web アプリケーションのランタイム クラスパスがダーティです。クラスの複数のクラス ファイル定義がありmodel.Dobavljac、それぞれが異なる によってロードされますClassLoader。デフォルトでは、webapp のランタイム クラスパスは、 のすべてのクラス ファイル、/WEB-INF/classesすべて/WEB-INF/libの JAR ファイル、サーバーの の/libすべての JAR ファイル、JRE/libおよびのすべての JAR ファイルをカバーします/lib/ext。サーバーには、特定の構成設定を介して追加された他のフォルダーを含めることができます。どのように、そしてどれが、あなたが何も言わなかったサーバーのメーカー/バージョンに正確に依存します。

.class実行時のクラスパスをクリーンアップし、重複するクラス ファイル定義 (単なるスタンドアロンファイル、または問題のあるファイルを含む JAR ファイル) を取り除き.classます。再構築/再デプロイ/再起動すると、この問題は解消されます。

于 2013-01-14T21:04:25.960 に答える