Month: September 2016

SpringBoot ile Rest ve Soap Api Örneği

SpringBoot Nedir?

SpringBoot, hızlıca deploy edilebilir yeni nesil web uygulaması oluşturmaya yarayan güzel bir spring implementasyonudur. Çalıştırılabilir jar dosyası çıkartarak web uygulaması ya da servis yazılabilir. Ben bu alt yapıyı kullanarak bir servis yazmak istedim.

Uygulamanın Amacı Nedir?

Servisimde “Poi” adında bir entity’yi crud işlemlerine tabi tutarak, “spring ile nasıl soap api yazılır“, “spring ile nasıl rest api yazılır” sorularına çözüm göstereceğim. Asıl amacım poi’nin hangi property’sini işlediğim değil, spring ile onu nasıl kullandığım olacak.

Servisimi yazarken, Spring’i de yeni öğreniyor oluşumdan dolayı spring’in annotation’larını doğru kullanmaya ve neden kullandığımı da açıklamaya özen göstereceğim. Ayrıca core, webService ve business lojiklerini doğru kullanmayı hedeflediğim güzel bir alıştırma projesi olacak.

Neler Anlatacağım?

Kodları yazı içinde paylaşmak yerine github’ı kullanacağım. Burada anlatacağım şeyler ise, yazılma amacı ve nasıl çalıştığı olacak.

https://github.com/sefersezer/SpringRestSoapApiExample


Proje kaynaklarını anlatmaya öncelikle maven dependencylerinden başlayacağım.

lombok: Compile time’da pojo’lardaki getter, setter, default constructor vb şeyleri otomatik oluşturan, kod kirliliğini azaltmayı sağlayan bir eklenti. Lombok, başka bir makalede detaylıca anlatılabilir.

spring-boot-starter-web: Uygulama web projesi olarak ayağa kalkıp bir portu kullanılabilir sunacak. Ayrıca ws paketinde spring boot web annotationlarını da kullanacağız.

spring-boot-starter-data-mongodb: Veritabanı olarak mongodb kullanacağım. Mongodb bağlantısını da spring yetenekleriyle kuracağım.

spring-boot-starter-ws: Spring web service annotationları için kullanıyorum. Mesela @Endpoint annotation’u soap (ve rest) actionlarını işlemek için projeyi otomatik tarayarak geçtiği sayfadaki @ResponsePayload’lı methodları kullanılabilir kılacak.

wsdl4j: soap api için xsd şablonundan wsdl generate etmeye yarayacak. Örneğin servis endpointi sonuna .wsdl koyarak şablona erişebiliyor olacağım.  (localhost:9000/ services /poiservice.wsdl )

modelmapper-spring: Core package ile Web Service package’larının bağımsız olacağından bahsetmiştik. Hedef pojo’m olan Poi için Web Service katmanında PoiEntity objesi oluşturdum. Bunların her bir property’sini manuel maplemek yerine modelMapper kullanacağım.

jackson: Serializabled objelerimi json, xml setlere dönüştürüp, büyük angaryadan kurtaran muhteşem dependency. #tambiraltinbilezik 🙂

jaxb2-maven-plugin: xsd şablonunu oluşturduktan sonra servis katmanındaki objeler için elle uğraşmayacağım heralde! mvn clean generate-sources ile deploy ettiğimiz zaman belirtilen dizine otomatik generate edilecek. (Artık javada pojo oluşturmak angarya iş olarak gözüküyor. Örneğin eclipse’de Telosys Tools ile pojo, dta, dto, testler vs birçok şey generate edebiliyorsunuz.)


Uygulamanın modüllerini (paketleri) ve sınıf isimlerini aşağıdaki gibi verdim:

  • config
    Spring'in Mongodb bağlantısını sağlamak için özel bir dependency eklemiştik.
    Bu dependency @EnableMongoRepositories annotation'ı sağlıyor. Mongodb
    repositorylerinin bulunduğu paketi göstererek (bir nevi) register ediyoruz.
    Ayrıca bağlantı kurarken host, port, db parametrelerini de
    AbstractMongoConfiguration sınıfını extend ederek set edebiliyoruz.
    
    Burada kullandığım Environment değerleri ise /resources/application.properties
    dosyasından geliyor.
    • MongoConfig.java
  • model
    Uygulamada Poi.java ve PoiEntity.java adında aynı gözüken ama 2 farklı amaca
    hizmet eden pojo bulunuyor. Ben her ne kadar bu projede extreme işlem yapmasam
    da modüllerin bağımsızlığının sağlanması gerektiğini gösterebilmek adına bu
    iki pojo'yu oluşturdum.
    
    Poi.java, uygulamanın core tarafındaki model entity'm olacak. Core tarafındaki
    işlemlerde bunu istediğim gibi manipule edeceğim; complex type olarak kullanıp içine istatiksel veriler vs ekleyip, gerekirse başka yerden
    implemente edilmiş özellikler vs kullanıp istediğim gibi kullanabileceğim.
    Servis tarafındaki PoiEntity.java ise, Poi.java'daki implementasyonlarımın
    çıktısı olacak. Kullanıcıya göstermek istediğim şeyleri en yalın haliyle
    oraya atacağım. Kullanıcı benim arka planda ne yaptığımdan, core'daki
    bağımlılıklarımdan haberdar olmayacak, sadece bu çıktıyı alıp kendi işine
    bakacak.
    
    Mapper, poi ile poiEntity'deki gerekli property'leri birbirine map ettiğim
    mapping servisim. Sınıfı incelediğimizde, normalde daha çok karışık olması
    gerekir ama bu uygulamada bişey yapmadığımdan ModelMapper dependency'sini
    kullanarak direkt mapping sağladım.
    
    repository/ dizinindeki poiRepository ise, mongodb'deki collection'a ulaşmamı
    sağlayan mongoDbRepository örneğim. FindAll, save, delete default işlemlerini
    mongoDbRepository sayesinde yapabiliyorum. Spesifik sorgularım için ise
    namedQuery denilen spring özelliği ile yazdığım methodlara uygun ismi ve dönüş
    tipi vererek crud işlemimi gerçekleştirebiliyorum. Detaylar için şu adrese
    bakabilirsiniz.
    • repository
      • PoiRepository.java
    • Mapper.java
    • Poi.java
  • service
     (acıklama)
    • endpoint
      • PoiRestEndpoint.java
      • PoiSoapEndpoint.java
    • PoiRepositoryService.java
  • ws
     (acıklama)
    • model
       (acıklama)
      • PoiEntity.java
      • ServiceResponse.java
    • rest
       (acıklama)
      • EntityService
      • EntityServiceImpl
    • soap
       (acıklama)
      • dao
        • DeletePoiRequest.java
        • GetPoiRequest.java
        • GetPoiResponse.java
        • ObjectFactory.java
        • package-info.java
        • SavePoiRequest.java
      • SoapWebServiceConfig.java
  • Application.java
    Uygulama bu sınıf ile ayağa kalkıyor. Sınıfa SpringBootApplication annotation
    ve diğer annotationları vererek, springBoot uygulaması olmasını, servis olarak
    çalışmasını, konfigurasyonları okumasını vs söylüyorum; ilk kıvılcımı buradan veriyoruz.
  • resources
     (acıklama)
    • application.properties
    • poiservice.xsd