16 Ağustos 2012 Perşembe

Servlet Web Service Endpoint '' Failure

Java ile web servis geliştirirken basit tipleri ve sınıfları kullanırken çok fazla problem yaşanmaz fakat kendi oluşurduğumuz sınıfları kullanmak istersek bir takım sorunlar yaşayabiliyoruz. Karşılaştığım  ve sebebini gerçekten çok zor bulabildiğim bir problemin çözümünden bahsedeceğim şimdi.

JAX-WS web servis oluştururken, daha önce başka bir projemde oluşturduğum bir sınıfı web servis metodunun dönüş nesnesi olarak belirledim. Fakat bu metodu yazıp projeyi derlemeye ya da çalıştırmaya çalıştığımda aşağıdaki hatayı aldım:

Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: Servlet web service endpoint '' failure. Please see server.log for more details.
/.../nbproject/build-impl.xml:725: The module has not been deployed.
See the server log for details.

Hata da çok fazla bir detay yok, derinlemesine koda girmem gerekti. Söylediğim gibi web servisler xml tabanlı olduğu için uğraştığınız sınıflarda herşeyin tanımlı olması lazım. Benim metodumda dönen sınıfın default constructor'ı tanımlanmamıştı. Bunu fark ettiğimde hemen bir cosntructor tanımlayıp denedim ve web servisin çalıştığını gördüm. Yani sorun, dönmek istediğim sınıfta default constructor olmamasıydı. Benim sınıfımda public olan başka hiç constructor yoktu dolayısıyla belki parametreli public constructor tanımlayarak da aynı şekilde çözüme gidilebilir.

( java, web servis, jax-ws, default constructor, illegalstateexception, lifecycleexception, endpoint, build-impl.xml )

23 Temmuz 2012 Pazartesi

android.database.sqlite.SQLiteMisuseException: error code 21

Merhaba,

Android tarafında karşılaştığım bir sorunu ve kısmi çözümünden bahsetmek istiyorum. Geliştirdiğim uygulamanın bir bölümünde SQLite bağlantısı yapıp veritabanına bir veri insert etmem gerekti. Bunu yaparken ilk önce SQLiteStatement kullanım parametreleri bind ederek kullanmak istedim. Bu şekilde parametreleri set edip executeInsert() metodunu çağırdığımda:
java.lang.RuntimeException: Unable to start activity ComponentInfo: android.database.sqlite.SQLiteMisuseException: error code 21: not an error
Şeklinde bir hata ile karşılaştım. Biraz araştırma yaptığımda öncelikle kaynaklarda, bu hatanın, birden çok threadin aynı anda veritabanı bağlantısı açıp kapaması esnasında olabildiğinden bahsediliyordu. Benim kodumda threadli bir yapı olmadığı gibi benzer bir kullanım da yoktu. Bu nedenle sorun bundan kaynaklı değildi. Sonrasında bir forumda başka bir arkadaş sorunun cihazın Türkçe set edilmiş Locale ayarlarından kaynaklı olabileceğini söylemişti. Bunu denemeye karar verdim. Cihazı İngilizceye çevirdiğim zaman sorun ortadan kalktı. Fakat kod tarafında bir şekilde Locale set ederek bu hatadan kurtulunmuyordu. Sonrasında kendi çözümümü ürettim. Belki bu soruna direkt olarak bir çözüm değil fakat benzer problemle karşılaşan arkadaşlar SQLiteStatement kullanmak yerine SQLiteDatabase sınıfının insert() metodunu kullanırlarsa bu sorunu çözebilirler. Tabi ki burada parametreleri artık ContentValues ile set etmek gerekecek. İlk başta belirttiğim gibi bu nedenle bu çözüm kısmi bir çözüm ama en azından hatadan kurtulabilirsiniz. 

Merak eden arkadaşlar için, hatayı aldığım cihazın gerekli bilgileri şu şekildedir:
Samsung Galaxy TabAndroid 3.2, Türkçe Locale  
( android, honeycomb, 3.2, sqlitemisuseexception, error code 21: not an error, sqlitedatabase, sqlitestatement, contentvalues )
Kaynak: http://stackoverflow.com/questions/9685633/sqlitemisuseexception-error-code-21-when-inserting-a-row 

2 Nisan 2012 Pazartesi

java.io.IOException: Server returned HTTP response code: 505 Çözümü

Glassfish üzerinde Java Web uygulaması geliştirirken bir adreste bulunan veriyi okumam gerekti. java.net.URL sınıfı ile bu URL'i okumak isterken başlıkta belirttiğim "java.io.IOException: Server returned HTTP response code: 505" hatasını aldım. Diğer parametrelerimde herhangi bir sorun gözükmemesine rağmen, özellikle localhost'da bulunan bir adresi çağırdığımda bu hata ile karşılaşmaya başladım. Biraz araştırma yaptıktan sonra sorunun URL'de geçen parametrelerin encode edilmeden URL'in çağrılmasından kaynaklı olduğunu buldum. Sorunun çözümü için ise yine aynı pakette bulunan URLEncoder sınıfını kullanmak yeterli. Bu sınıf içerisindeki encode() metoduna, encode edilmesini istediğiniz parametreyi ya da URL'in tamamını verip character encoding olarak da utf8 kullanmanız yeterli.
URLEncoder.encode("Test Parameter", "utf8");
URLEncoder.encode(myURL, "utf8"); 
( java, glassfish, url, encode, utf8, http 505, urlencoder, java.io.ioexception ) 

26 Mart 2012 Pazartesi

Netbeans’de Java Class Library Projesine JAR Ekleme

Farklı bazı projelerde kullanmak üzere bir takım sınıfları içeren JAR dosyası oluşturmak için Java Class Library projesini Netbeans kullanıcılarının büyük kısmı kullanmıştır. Oluşturulan projenin içerisine herhangi başka bir kütüphane eklemek istediğimizde bir problem yaşamadan ilgili JAR dosyasını kullanabiliyoruz. Fakat oluşturduğumuz projeyi build edip sonrasında oluşturulan JAR dosyasını başka bir projede kullanmak istersek bu sefer o proje içerisine eklediğimiz kütüphaneye ulaşamayız. Ulaşmaya çalışırsak ClassNotFoundException almamız ise muhtemel.

Buradaki temel problem aslında şu. Bildiğiniz gibi JAR dosyaları, içerisinde derlenmiş class dosyaları taşır. Bu nedenle bir projede rahatlıkla kullanılabilir. Fakat bir class library projesine bu JAR dosyasını koyarsak ve sonrasında projeyi build edersek JAVA class dosyalarını yeniden derlemeyecektir. Bu da bizim yeni üretilen JAR dosyamızın içerisinde, projeye eklediğimiz diğer kütüphanelerin olmaması anlamına gelecektir.

Sözü fazla uzatmadan konuya giriyorum. Yapmamız gerekenler şu şekilde. Projemizi tamamladıktan sonra build etmeden hemen öncebuild.xml dosyasının içerisinde bir değişiklik yapacağız. Böylece istediğimiz JAR dosyalarını içeren bir JAR dosyası elde edeceğiz. Örneğin projemize gson-2.1.jar‘ı ekleyelim. Bunun için build.xml dosyamızda aşağıdaki gibi bir değişiklik yapmalıyız. İlgili alanları kendi dosya isimleriniz ile değiştirebilirsiniz.

<target name="SON-JAR">
   <jar jarfile="dist/SON_DOSYA.jar">
      <zipfileset src="${dist.jar}"excludes="META-INF/*"/>
      <zipfileset src="lib/gson-2.1.jar"excludes="META-INF/*"/>
      <manifest>
         <attribute name="Main-Class"value="com.test.maktas.Main"/>
      </manifest>
   </jar>
</target>

Bu işlemden sonra projemizi build ettiğimizde çıkacak JAR dosyasında ilgili kütüphane dosyalarının da olduğunu göreceğiz.

( java, netbeans, jar, library, ClassNotFoundException, referring, java class library, jar inside jar )

1 Mart 2012 Perşembe

org.hibernate.HibernateException: Wrong column type Found Çözümü

Merhaba, hibernate kullanırken ortaya çıkan basit ama can sıkıcı bir problemin çözümünü paylaşmak istiyorum. Java tarafında @Entity annotation'ı ile oluşturduğum bir sınıfta, String değişkenleri @Column annotation'ı ile bağladım. Bu işlemi yaparken annotation parametresi olarak yalnızca column name'i verdim. Bu şekilde veritabanı tarafına bağlanmaya çalıştığımda, başlıkta geçen "org.hibernate.HibernateException: Wrong column type Found: char, expected: varchar2(255)" hatasını aldım. Bu hatayla karşılaşanlar için gelelim sebebine ve çözümüne...
@Column(name = "veritabani_alani")
public String getAlan() {
   return alan;
}
Hatayı alırken kullandığım veritabanı MySQL'di. Hibernate ile oluşturmadığım, daha önce elle tanımlanmış tabloları kullanıyordum. Bu tabloların karakter içeren alanları ise CHAR tipinde tanımlanmıştı. Hibernate, entity sınıflarında String olarak tanımlanan değişkenleri veritabanında eşlerken VARCHAR(255) kullanır. Herhangi bir spesifik karakter tipi belirtilmediği için ve Hibernate, alanın veritabanındaki karşılığını VARCHAR(255) değil de, tanımadığı bir tip olan CHAR görünce böyle bir hata ortaya çıkıyor. Benzer durumda bu hata belki alınmayabilir fakat schema validation alanı validate yapıldığı zaman Hibernate alanı valdiate edemediği için bu hata alınıyor. 

Hatayı düzeltmek için yapılması gereken şey aslında basitçe Hibernate'e bu alanın tipinin CHAR olduğunu göstermek. Bunu için de @Column'a bir parametre daha ekliyoruz ve tipi belirtiyoruz.
@Column(name = "veritabani_alani", column_definition="char")
public String getAlan() {
   return alan;
}
( char, column_definition, database, hibernate, java, mysql, org.hibernate.HibernateException, varchar, wrong column type found )
Kaynak: http://cedar715.wordpress.com/2009/10/13/org-hibernate-hibernateexception-wrong-column-type-found-char-expected-varchar2255/