autoCompelete bileşeninde String casting problemi.

UI Components for JSF
Post Reply
i18n
Posts: 33
Joined: 15 Aug 2010, 11:24

16 Aug 2010, 11:15

Merhaba.

PrimeFaces bileşen kütüphanesini kullandığım projemde autoComplete bileşeninin kullanımında bir problemim var. Yardımcı olmanız dileği ile bu konuyu açıyorum.

Problemim kısaca şöyle.

Servis isminde bean olarak tanımlı olmayan bir entity classım var. Bu classın plaka alanına bağlı, bilgi girişi yapılan formda daha önce kalıcılaştırılmış plaka bilgisinin kullanıcıya gösterilmesini arzu ediyorum.

Konuyla ilgili kodum şöyle.

Code: Select all

<p:autoComplete value="#{servisAdd.selectedServis}" binding="#{servisAdd.plakaText}"
                                                                 completeMethod="#{servisAdd.completePlaka}" required="true"
                                                                 requiredMessage="Plaka alanı boş bırakılamaz..."/>

Code: Select all

    private Servis selectedServis;
    private List<Servis> servisler;

public ServisAdd(){
        listDoldur();
        em = emf.createEntityManager();
        servisler = em.createQuery("SELECT s FROM Servis s WHERE s.fmk=" + frmKod).getResultList();
    }

    public Servis getSelectedServis() {
        return selectedServis;
    }

    public void setSelectedServis(Servis selectedServis) {
        this.selectedServis = selectedServis;
    }

    public List<Servis> completePlaka(String query) {
        
        List<Servis> oneriler = new ArrayList<Servis>();

        for(Servis s : servisler) {
            if(s.getPlaka().startsWith(query))
                oneriler.add(s);
        }
             return oneriler;
    }
Projeyi derleyip çalıştırdığımda, autoComplete bileşeninde bir değer girdiğimde consola şu hata mesajı bastırılıyor.

java.lang.ClassCastException: org.pojo.entity.Servis cannot be cast to java.lang.String

Bu hata mesajından anladığım kadarıyla Servis nesnesi String tipine cast edilemiyor.

Dökümanlardan autoComplete metodunun completeMethod attributesuna dönüş tipi Stringden farklı nesneleri de bağlayabildiğimizi anlıyorum.

O halde ben burada nasıl bir yanlışlık yapmış olabilirim?

Saygılarıma.


Serhan ASLAN
Last edited by i18n on 21 Sep 2010, 18:21, edited 1 time in total.


i18n
Posts: 33
Joined: 15 Aug 2010, 11:24

16 Aug 2010, 13:02

Cevap için teşekkür ederim.

Kullanımla ilgili bir sorum var.

Code: Select all

<p:autoComplete value="#{autoCompleteBean.selectedPlayer}"  
                completeMethod="#{autoCompleteBean.completePlayer}"  
                var="player" itemLabel="#{player.name}"   
                itemValue="#{player}" converter="player"/>  
Burada convertar attributesı bean adı mı?

PlayerConverter sınıfını bean olarak mı tanımlıyoruz?

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

16 Aug 2010, 13:10

PlayerConverter icin faces-config tanimi;

Code: Select all

<converter>
        <converter-id>player</converter-id>
        <converter-class>org.primefaces.examples.view.PlayerConverter</converter-class>
    </converter>
JSF 2.0 kullaniyorsaniz, @FacesConvertor annotation'ini da kullanabilirsiniz. Burdaki convertor id, autoComplete in kullanacagi convertor id ile ayni olmali.

i18n
Posts: 33
Joined: 15 Aug 2010, 11:24

16 Aug 2010, 13:37

Çok teşekkür ederim.

Şimdi her şey yolunda.

Saygılarımla


Serhan ASLAN

cagatay.civici
Prime
Posts: 18616
Joined: 05 Jan 2009, 00:21
Location: Cybertron
Contact:

16 Aug 2010, 16:47

Calismasina sevindin, kolay gelsin.

i18n
Posts: 33
Joined: 15 Aug 2010, 11:24

20 Sep 2010, 18:08

Selam optimus hocam.

Günler sonra yine bu konuyla karşındayım :)

Şöyle bir sıkıntı var.

AutoComplete bileşeninde listelenecek alanda tekrarlar olamamsı için sorguda distinct kullandığımda tekrar "cannot be cast" hatası alıyorum.

Bu konuda atladığım bir detay olabilir mi?

i18n
Posts: 33
Joined: 15 Aug 2010, 11:24

21 Sep 2010, 18:21

Tekrar merhaba.

Bu bileşeni belkide tasarlandığı amaçtan farklı kullanmaya çabalıyorum ama ne yapayım, bana öylesi lazım :)

autoComplete bileşeninde bir seçim yapılmadığında yani alana listelenen değerlerden farklı değerler girildiğinde de bunu kullanmak istiyorum, çünkü bu kaydı db'ye atıcam ve tekrar girildiğinde listeleyeceğim.

Bunun için şöyle bir yöntem izliyorum.

Code: Select all


private String autoCompleteQuery;

    public List<Servis> completePlaka(String query) {

        if(!query.equals(""))
            setAutoCompleteQuery(query);

        List<Servis> plaka = new ArrayList<Servis>();

        for(Servis s : servisler) {
            if(s.getPlaka().startsWith(query))
                plaka.add(s);
        }
        return plaka;
    }
Bu yöntemle amacım, autoComplete bileşeninden bir seçim yapılmadığında autoCompleteQuery değişkeni ile girilen değeri db'ye kaydetmek.

Sorun şuradaki save metodum içinde bu değişkenin sıfırlandığını görüyorum, bunun için görünürde de hiçbir sebep yok.

autoCompleteQuery değişkenine atama yapılan tek yer completePlaka metodu.

Burada sormak istediğim, bu duruma bileşenin bilmediğim bir özelliği sebep olmuş olabilir mi?

complete metodunun farklı zamanlarda da çağrılabileceği aklıma geldi bu yüzden query değeri boş olmadığında autoCompleteQuery'ye atama yapılması için gerekli düzenlemeyi de yaptığım halde değişken sıfırlanıyor.

Bu konuda bir fikriniz var mı?

Saygılarımla


Serhan ASLAN

i18n
Posts: 33
Joined: 15 Aug 2010, 11:24

21 Sep 2010, 22:19

Sorunlardan birisini hallettim.

autoComplete metodunda öneri olarak listelenmemiş bir değeri de bileşenden dönüş değeri olarak almak için, convertor de şöyle bir çözüm ürettim.

Code: Select all


  public Object getAsObject(FacesContext facesContext, UIComponent component, String submittedValue) {

        if (submittedValue.trim().equals("")) {
            return null;
        } else {
            try {
                boolean dondur = false;
                for (Servis p : servisDB) {
                    if(p.getPlaka().equals(submittedValue)){
                        dondur = true;
                        return p;
                    }
                }
               /////////ISTE TAM BURADA///////////
                if(!dondur){
                    Servis s = new Servis();
                    s.setPlaka(submittedValue);
                    return s;
                }

            } catch(Exception exception) {
                throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Conversion Error", "Not a valid servis"));
            }
        }
Bileşene bağlanan pojoya göre kullanıcı getAsObject metodu içinde farklı çözümlerde üretebilir.

DISTINCT ile ilgili sorunum ise devam ediyor.

Öneri olarak listenelecek pojoların benzer kayıtlardan arındırılmasını arzuluyorum.

"SELECT DISTINCT s.plaka FROM Servis s group by s.plaka" şeklinde oluşturulan sorgudan dönen pojo listi, complete metodu içinde casting hatasına sebep oluyor.

Bunun tam olarak neden meydana geldiğini bir türlü anlayamadım, "SELECT s FROM Servis s" ile dönen de Servis tipinde list, "SELECT DISTINCT s.plaka FROM Servis s group by s.plaka" sorgusundan dönen de.

Yoksa öyle değil mi?

i18n
Posts: 33
Joined: 15 Aug 2010, 11:24

22 Sep 2010, 17:48

Sorunumu malesef distinct kullanmayarak, kod içi müdahale ile aştım.

Paylaşayım, yararlanabilecek arkadaşlar olabilir.

Code: Select all

public List<Servis> completePlaka(String query) {

        boolean copy = false;
        List<Servis> plaka = new ArrayList<Servis>();

        for(Servis s : servisler) {
            copy=false;
            if(s.getPlaka().startsWith(query.replace(" ", "").toUpperCase())){

                for(int i=0; i<plaka.size();i++){
                    if(s.getPlaka().equals(plaka.get(i).getPlaka())){
                       copy=true;
                       break;
                    }
                }

                if(!copy)
                    plaka.add(s);

            }
        }
        return plaka;
    }
Saygılarımla


Serhan ASLAN

Post Reply

Return to “PrimeFaces”

  • Information
  • Who is online

    Users browsing this forum: mahmoudxkhaled and 7 guests