Merhabalar. Bir deneme projemde JDBC ile oluşturduğum Connection nesnesini Inject annotasyonu ile injekte etmek istiyorum. Inject yapmayıp Veritabani vt=new Veritabani(); dediğimde proje çalışmasına karşın, Inject Veritabani vt; dediğimde nullpointerexception hatası alıyorum. Bu tip nesnelerin enjeksiyonu mümkün değil mi yoksa ben mi bir hata yapıyorumdur.

Sorunun açıklayıcı olması açısından kodları gönderiyorum. Teşekkürler.

Interface sınıf

package com.orhan.mini_cbs.vt;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 *
 * @author Orhan
 */
public interface VeritabaniAy {
   Connection baglantiKur();
   void baglantiKapat(ResultSet sonucT, Statement beyan);
}

Implement sınıf

    package com.orhan.mini_cbs.vt;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author Orhan
 */
public class Veritabani implements VeritabaniAy{
    private static final String SURUCU="org.apache.derby.jdbc.ClientDriver";
    private static final String VT_ADRES="jdbc:derby://localhost:1527/mini_gis";
    private static final String KULLANICI="orhan";
    private static final String PAROLA="2524305";
    private static Connection vt_baglanti=null;
    @Override
      public Connection baglantiKur(){

         try{
              Class.forName(SURUCU);
              System.out.println("Sürücü yerleştirildi...");
         }catch(ClassNotFoundException cnfe){
             System.out.println(cnfe.getMessage());
         }
         try{
         vt_baglanti=DriverManager.getConnection(VT_ADRES, KULLANICI,PAROLA);
        System.out.println("Bağlantı kuruldu...");
         }catch(SQLException sqle){
             System.out.println(sqle.getMessage());
         }
         return vt_baglanti;
     }
    @Override
   public void baglantiKapat(ResultSet sonucT, Statement beyan){
        try {
            vt_baglanti.close();
            System.out.println("Bağlantı kapatıldı...");
        } catch (SQLException sqle) {
            System.out.println(sqle.getMessage());
        }
   }
}

Enjeksiyonun yapılacağı sınıf

package com.orhan.mini_cbs.srg;

import com.orhan.mini_cbs.vt.VeritabaniAy;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.inject.Inject;

/**
 *
 * @author Orhan
 */
public class Sorgular implements SorgularAy{

    @Inject
    private VeritabaniAy vt;
    private Statement beyan=null;
    @Override
    public ResultSet hepsiniGetir(String sorgu) {
       //Veritabani vt=new Veritabani();
        Connection baglanti=vt.baglantiKur();

        try{
            beyan=baglanti.createStatement();
            ResultSet sonucT=beyan.executeQuery(sorgu);
            return sonucT;
        }catch(SQLException e){
            System.out.println("Sorgu hatası : " +e.getMessage());
        }   
        return null;
    }
}

Main sınıfı

package com.orhan.mini_cbs.srg;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 *
 * @author Orhan
 */
public class Uygulama {
    public static void main(String[] args){
        Sorgular sorgula=new Sorgular();
        ResultSet sonuc=sorgula.hepsiniGetir("Select * from sekil");
      try{ 
        while(sonuc.next()){
        System.out.println(sonuc.getString(2));
        }
      }catch(SQLException e) {
          System.out.println("Hata var!" + e.getMessage());
      }
    }
}

Sonuç

Exception in thread "main" java.lang.NullPointerException
    at com.orhan.mini_cbs.srg.Sorgular.hepsiniGetir(Sorgular.java:28)
    at com.orhan.mini_cbs.srg.Uygulama.main(Uygulama.java:19)

soruldu: 09 Ara '14, 06:01

orhaltin's gravatar image

orhaltin
66336
cevap kabul oranı: 0%

değiştirildi: 09 Ara '14, 10:32

CemIkta's gravatar image

CemIkta ♦
19.9k29125190

Teorik olarak bean olarak yazilmis her class inject edilebilir. Neden hata aldiginiz ancak kod parcaciklari paylasirsaniz anlasilabilir.

(09 Ara '14, 08:34) CemIkta ♦ CemIkta's gravatar image

Dependency Injection (DI) veya Context and Dependency Injection (CDI) kullanmak icin bir implementasyona ihtiyaciniz var. Genellikle DI, CDI implementasyonlari uygulama sunuculariyla (Application Server) birlikte gelir, projenizde ornegin maven bagimliligi (maven dependency) eklerseniz uygulama sunucusu sizin icin DI, CDI kullanimini aktif hale getirir.

Sizin kodlarinizdan anladigim kadariyla siz uygulama sunucusu olmadan bir java projesi calistiriyorsunuz (main methodu ile). Kisaca cevap vermek gerekirse Java'da DI, CDI kullanmak icin bir implementasyona (JBoss Weld, Google Guice gibi) ve bir EJB Container'a (bu durumda uygulama sunucular bunu sagliyor WildFly, Glassfish gibi) ihtiyaciniz var. CDI genel olarak web projeleri ve EJB Container destekleyen uygulama sunuculari icin gelistirilmistir.

Normal Java projelerinde (web projesi olmayan Rich Client veya Console projelerini kast ediyorum) DI kullanmak isterseniz en basit ve pratik kullanima Google Guice'i tavsiye ederim. Sizin kodlarinizda Google Guice kullanimi gayet basit. Veritabani class'ina @Singleton annotasyonunu ekleyin, bu sadece bir kez veritabani baglantisi yapilmasini saglar. Google Guice ile inject yaparken yine @Inject private VeritabaniAy vt; kullanabilirsiniz. Google Guice de interface'lerle implementasyonlar yapiyorsaniz bunu Google Guice modulunde bir kez tanimlamalisiniz.


/**
 * Application Guice injector
 *
 * @author Cem Ikta
 */
public class GuiceInjector extends AbstractModule {

@Override
    protected void configure() {
        // interface class, implement eden class verilir.
        bind(Veritabani.class).to(VeritabaniImpl.class);
    }
}

Ayrica proje start edilirken Google Guice injector create edilebilir.

Injector injector = Guice.createInjector(new GuiceInjector());

Google Guice ile buyuk projelerde cok kompleks class ve bagimliliklarini degisik sekillerde inject etmek mumkun. Google Guice hafifligi (lightweight) esas aldigi icin uygulama sunucu (EJB Container'siz) olmadan sadece Web Server veya Rich Client, Console projelerinde de kullanilabilir. Google Guice dokumanlarinda detayli kullanim sekilleri var.

permanent link

cevaplandı: 09 Ara '14, 10:57

CemIkta's gravatar image

CemIkta ♦
19.9k29125190
cevap kabul oranı: 36%

değiştirildi: 09 Ara '14, 11:04

Çok teşekkür ederim Üstad. Google Guice ile ilgili hiçibir bilgim yoktu, ayrıca verdiğiniz örnek te çok açıklayıcı. Teşekkürler.

(09 Ara '14, 11:11) orhaltin orhaltin's gravatar image
Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×7
×5

Soruldu: 09 Ara '14, 06:01

Görüntüleme: 599 kez

Son güncelleme: 09 Ara '14, 11:11

powered by BitNami OSQA