spring web service
DESCRIPTION
Anlaşma-Önce ve Anlaşma-Sonra Web Service geliştirim yöntemleri ve Başlangıç düzeyinde Spring Web Service.TRANSCRIPT
1/35
MUSTAFA DEMİR&
MUSTAFA DAŞGIN
Spring Web Service
2/35
Biz Kimiz ?
Mustafa DEMİR ODTÜ Bilgisayar Mühendisliği Bölümü - 2005 Spring teknolojileri, JSF ve Hibernate Çevik uygulama geliştirme, TDD, Tasarım Örüntüleri http://demirm.blogspot.com [email protected]
Mustafa DAŞGIN Hacettepe Üniversitesi Bilgisayar Mühendisliği Bölümü - 2006 Spring teknolojileri, JSF ve Hibernate Refactoring, TDD, Tasarım Örüntüleri “Ucundan Java” http://mdasgin.blogspot.com [email protected]
3/35
İçerik
Web Service Nedir ?WS Geliştirim YaklaşımlarıNeden Anlaşma Önce ?Neden Spring WS ?Spring WS TerimleriSpring WS MimarisiÖrnek Uygulama (Sunucu-İstemci)KaynakçaSorular
4/35
Web Service Nedir ?
Bir ağ üzerinden farklı platformlara mensup makinelerin birlikte çalışabilirliğini destekleyecek şekilde tasarlanan yazılım sistemleri.
Servis ve bileşenlerin “tekrar kullanılabilirliği” Web Service vs. RPC/RMI XML
5/35
WS Geliştirim Yaklaşımları
WSDL (Web Services Description Language) XML Belgesi Data Contract (XML Schema) WS’nin Konumu WS’nin Sunduğu Hizmetler (Operasyonlar)
Anlaşma Önce (Contract First)Anlaşma Sonra (Contract Last)
6/35
Anlaşma Önce Yaklaşımı
WSDL belgesi baz alınır Sunucu ve istemci birbirinden bağımsız
gerçekleştirilir. Büyük projeler için idealdir.
WSDL, SOAP ve XSD ayrıntısına girilir. Öğrenim ve uygulama süresini uzatır. İş mantığı dışındaki ayrıntılarla da uğraştırır.
7/35
Anlaşma Sonra Yaklaşımı
Gerçekleştirim baz alınır WSDL , SOAP ve XSD ayrıntısına girilmez. Öğrenim ve uygulama süresi kısadır. Sadece iş mantığıyla ilgilenmenizi sağlar.
Sunucu ve istemci geliştirimi birbirine bağımlıdır. Büyük Projeler için ideal değildir.
8/35
Neden Anlaşma Önce ?
O/X Mapping Sorunları Davranış Farklılıkları
Java – Altsınıf XSD – Kısıtlamalar
<simpleType name="AirportCode"> <restriction base="string">
<pattern value="[A-Z][A-Z][A-Z]"/> </restriction>
</simpleType>
9/35
Neden Anlaşma Önce ?
Desteklenmeyen veri tipleri Java – java.util.TreeMap .Net – System.Collections.Hashtable
XML – date tipi: 2007-04-04 Java Date ve Calendar sınıfı: 2007-04-04T00:00:00
<element name="GetFlightsRequest"> <complexType> <all>
<element name="departureDate" type="date"/> <element name="from" type="string"/>
<element name="to" type="string"/> </all> </complexType></element>
10/35
Neden Anlaşma Önce ?
Döngüsel İlişkilerpublic class Flight {
private String number; private List<Passenger> passengers;
}
public class Passenger { private String name; private Flight flight;
}
<flight number="KL1117"> <passengers> <passenger> <name>Arjen Poutsma</name> <flight number="KL1117"> <passengers> <passenger> <name>Arjen Poutsma</name>
...
11/35
Neden Anlaşma Önce ?
Kırılganlık Anlaşma sonra yaklaşım ile anlaşmanın uzun süre
sabit kalma garantisi yoktur. Kod değiştikçe anlaşma da değişir. Kullanılan Web Service mimarisinde değişikliğe gidilmesi
üretilen anlaşmayı da değiştirir.
Sunucu kodundan kaynaklı anlaşma değişikliği her defasında istemci kodlarının da değişikliğini gerektirir.
Anlaşmanın yararlı olması için uzun süre sabit kalması gerekir.
12/35
Neden Anlaşma Önce ?
Performans Anlaşma sonra yaklaşımda karşıya neyin gönderileceği
belli değildir. Nesnenin ilişkili olduğu bir çok nesne XML’e dönüştürülüp gönderilebilir ve bu esnada performans ve cevap süreleri etkilenir.
Anlaşmanın belli olduğu durumda XML’de neyin karşıya gönderileceği açıkça bellidir.
Tekrar Kullanılabilirlik XSD bilgisini ayrı bir dosyada tanımlayarak tekrar
kullanılabilirliğini sağlanabilir.
13/35
Neden Spring WS ?
Anlaşma önce yaklaşımın eksikliklerini kapatır. WSDL ve SOA ayrıntılarıyla uğraştırmaz. Sadece XSD
şeması
Öğrenim ve uygulama süresi çok kısadır Spring mantığını bilen geliştiriciler için.
İş mantığı dışındaki ayrıntıların çoğunu üstlenir.
Anlaşma ve gerçekleştirim arasındaki bağımlılığı azaltır.
14/35
Neden Spring WS ?
Gelen XML mesajı, içeriğine göre herhangi bir nesneye mapping yapılabilir.
XML mesajı çeşitli XML API’leri kullanılarak işlenebilir. (DOM, SAX, StAX, JDOM, dom4j, XOM)
O/X Mapping modülü sayesinde çeşitli çatılar ile uyumlu çalışır. (JAXB 1 ve 2, Castor, XMLBeans, JiBX, and XStream)
SOAP mesajlarının şifrelenmesi için WS-Security desteği sağlar.
Spring Security(Acegi Security) ile bütünleşik çalışabilir böylece varsa Acegi ayarları SOAP servisleri için kullanılabilir.
15/35
İçerik
Web Service Nedir ?WS Geliştirim YaklaşımlarıNeden Anlaşma Önce ?Neden Spring WS ?Spring WS TerimleriSpring WS MimarisiÖrnek Uygulama (Sunucu-İstemci)KaynakçaSorular
16/35
Spring WS Terimleri
WebServiceMessage Platform bağımsız XML mesajlarını ifade eder. Web mesajlarındaki payload kısmına erişimi sağlar
SoapMessage SOAP için gerekli operasyonları içeren arayüzdür.
SOAP Envelope SOAP Action SOAP Header etc..
17/35
Spring WS Terimleri
MessageFactory Sınıfları Web servis mesajları oluşturmayı sağlarlar. Farklı kaynaklardan (input streams) web servis
mesajları oluşturmaya yardımcı olurlar.
Gerçekleştirimleri:
SaajSoapMessageFactory (SOAP with Attachments API for Java) JEE 1.4 ün parçası– uygulama sunucuları tarafından en çok
desteklenen tür DOM API sini kullanır – SOAP mesajları bellekte tutulur.
Büyük mesajlar için performanslı değildir.
18/35
Spring WS Terimleri
MessageFactory Sınıfları AxiomSoapMessageFactory
Axis 2 Object Model kullanır. STAX (Streaming API for XML) üzerine kuruludur. Büyük mesajlar için uygundur.
19/35
Veri Alış-Verişi
HTTP Transport Yaygın şekilde kullanılmakta Servlet aracılığı ile yapılmakta
<web-app>
<servlet> <servlet-name>spring-ws</servlet-name> <servlet-class> org.springframework.ws.transport.http.MessageDispatcherServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet>
<servlet-mapping> <servlet-name>spring-ws</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
</web-app>
20/35
Veri Alış-Verişi
HTTP Transport ... Otomatik WSDL Üretimi
WsdlDefinition bean tanımları taranır. Bean id si ile dışarı açılır (expose)
<bean id="orders" class="org.springframework.ws.wsdl.wsdl11.SimpleWsdl11Definition"> <constructor-arg value="/WEB-INF/wsdl/Orders.wsdl"/> </bean>
http://localhost:8080/spring-ws/orders.wsdl
21/35
Veri Alış-Verişi
Spring MVC - DispatcherServletJMS TransportEmail TransportEmbedded HTTP Server Transport
Örnek uygulama da kullanılacak.
22/35
Spring WS Mimarisi
23/35
Spring WS Mimarisi
Sequence Diagram Spring Referans dokümanından alınmıştır.
24/35
Endpoints
Web servis mesajlarının iletildiği noktalardır.İş katmanı ile web servis arasındaki iletişimi
sağlarİş mantığı sonrası web servis cevabı
oluşturulur ve dönülür.PayloadEndpoint arayüzünden
gerçekleştirilir.public interface PayloadEndpoint {
/** * Invokes an operation. */ Source invoke(Source request) throws Exception;
}
25/35
Endpoints ...
MessageEndpoint Arayüzü Mesajlar dışında message context e de ihtiyaç
duyulması SOAP Header eklemek Mesaj içerisinden attachment almak vs..
Endpoint interceptor ler kullanılarak da yapılabilir.
26/35
Endpoints ...
AbstractDomPayloadEndpoint W3C DOM API kullanılır.
AbstractJDomPayloadEndpoint – JDOM API AbstractXomPayloadEndpoint – XOM API
package sunum; public class SampleEndpoint extends AbstractDomPayloadEndpoint { protected Element invokeInternal(Element requestElement,
Document document) throws Exception { String requestText = requestElement.getTextContent();
System.out.println("Request text: " + requestText); Element responseElement = document.createElementNS("http://samples",
"response"); responseElement.setTextContent(“someResponseText"); return responseElement;
} }
27/35
Endpoints ...
AbstractMarshallingPayloadEndpoint Java nesnelerine çevrilmiş xml mesajları kullanılır.
package sunum;
public class MarshallingOrderEndpoint extends AbstractMarshallingPayloadEndpoint{
protected Object invokeInternal(Object request) throws Exception { //do some job
} }
28/35
Endpoints ...
Annotated Endpoints @Endpoint annotation ile kullanılır. Tek endpoint sınıfında birden fazla istem ele alınabilir.
@PayloadRoot annotation ı ile sağlanır.package sunum;
@Endpoint public class AnnotationOrderEndpoint {
@PayloadRoot(localPart = "orderRequest", namespace = "http://samples")
public Order getOrder(OrderRequest orderRequest) { // get order
} @PayloadRoot(localPart = "order", namespace = "http://samples") public void order(Order order) {
// Create some order}
}
29/35
Endpoint Mappings
Gelen mesajların Endpoint lere iletilmesini sağlar. PayloadRootQNameEndpointMapping
Gelen XML mesajlarına göre yapılır.
<bean id="endpointMapping" class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping"> <property name="mappings">
<props> <prop key="{http://samples}orderRequest">getOrderEndpoint</prop> </props>
</property> </bean><bean id="getOrderEndpoint" class=“somepackage.GetOrderEndPoint" />
<?xml version="1.0" encoding="UTF-8"?><orderRequest xmlns="http://samples"> </orderRequest>
30/35
Endpoint Mappings ...
SoapActionEndpointMapping SOAP Action header a göre yapılır.
MethodEndpointMapping (@EndPoint) PayloadRootAnnotationMethodEndpointMapping
(@PayloadRoot) Gelen XML mesajı
SoapActionAnnotationMethodEndpointMapping (@SoapAction) SOAP Action Header
31/35
İçerik
Web Service Nedir ?WS Geliştirim YaklaşımlarıNeden Anlaşma Önce ?Neden Spring WS ?Spring WS TerimleriSpring WS MimarisiÖrnek Uygulama (Sunucu-İstemci)KaynakçaSorular
32/35
Örnek Uygulama
Data Contract Hazırlanması (XML Şema)Sunucu Geliştirimi
Annotation tabanlıWSDL Üretilmesiİstemci Geliştirimi
33/35
Spring WS Mimarisi
34/35
Kaynakça
Spring Web Services Project Page http://static.springsource.org/spring-ws/sites/1.5/ http://static.springsource.org/spring-ws/sites/1.5/refer
ence/html/index.html
SOA: Principles of Service Design Thomas Erl, Prentice Hall
35/35
TEŞEKKÜRLER
Sorular..