Contract-First Development কি?
Contract-First Development এমন একটি পদ্ধতি যেখানে ওয়েব সার্ভিস তৈরির আগে তার জন্য কন্ট্রাক্ট বা চুক্তি নির্ধারণ করা হয়। এই কন্ট্রাক্ট সাধারণত একটি WSDL (Web Services Description Language) ফাইল বা XML Schema আকারে থাকে। এটি নির্ধারণ করে যে, সার্ভিস কীভাবে কাজ করবে এবং এর ডেটা কাঠামো কেমন হবে।
Contract-First Development কেন গুরুত্বপূর্ণ?
- স্ট্যান্ডার্ড বজায় রাখা: এটি একটি নির্ধারিত ফরম্যাটে কন্ট্রাক্ট তৈরি করে, যা সার্ভিস কনজিউমার এবং প্রোভাইডার উভয়ের জন্য গ্রহণযোগ্য।
- ইন্টারঅপারেবিলিটি: বিভিন্ন প্ল্যাটফর্ম এবং ভাষার মধ্যে সহজেই কাজ করার সুবিধা প্রদান করে।
- ডেটা ভ্যালিডেশন: XML Schema ব্যবহার করে ইনপুট এবং আউটপুট ভ্যালিডেশনের সুবিধা দেয়।
- ডকুমেন্টেশন স্বয়ংক্রিয়: WSDL বা XML স্কিমা সার্ভিসের জন্য ডকুমেন্টেশনের কাজও করে।
Spring Web Services এ Contract-First Development
স্প্রিং ওয়েব সার্ভিসেস কন্ট্রাক্ট-প্রথম পদ্ধতির জন্য উপযুক্ত কারণ এটি XML স্কিমা বা WSDL এর উপর ভিত্তি করে ওয়েব সার্ভিস তৈরি করার জন্য প্রয়োজনীয় টুলস সরবরাহ করে। এই পদ্ধতিতে প্রথমে XML বা WSDL কন্ট্রাক্ট লেখা হয়, তারপরে সেই কন্ট্রাক্ট অনুযায়ী কোড তৈরি করা হয়।
Contract-First Development এর ধাপসমূহ
১. XML Schema বা WSDL তৈরি
প্রথম ধাপে কন্ট্রাক্ট নির্ধারণ করা হয়। উদাহরণস্বরূপ, নিচে একটি XML Schema দেখানো হলো:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/contract">
<xs:element name="MyRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="MyResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="message" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
২. JAXB Object তৈরি
XML Schema থেকে JAXB Object তৈরি করার জন্য XJC (XML-to-Java Compiler) টুল ব্যবহার করা হয়। Maven প্লাগইন দিয়ে এটি স্বয়ংক্রিয়ভাবে করা যায়।
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<schemaDirectory>${basedir}/src/main/resources</schemaDirectory>
<outputDirectory>${basedir}/src/main/java</outputDirectory>
</configuration>
</plugin>
৩. SOAP Endpoint তৈরি
SOAP সার্ভিসের জন্য একটি @Endpoint তৈরি করা হয়:
@Endpoint
public class MySoapEndpoint {
@PayloadRoot(namespace = "http://example.com/contract", localPart = "MyRequest")
@ResponsePayload
public MyResponse handleRequest(@RequestPayload MyRequest request) {
MyResponse response = new MyResponse();
response.setMessage("Hello, " + request.getName());
return response;
}
}
৪. Bean Configuration
Spring এর মাধ্যমে SOAP সার্ভিসের জন্য প্রয়োজনীয় Bean কনফিগার করা হয়।
@Configuration
@EnableWs
public class SoapWebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext context) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(context);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<>(servlet, "/ws/*");
}
@Bean
public XsdSchema mySchema() {
return new SimpleXsdSchema(new ClassPathResource("my-schema.xsd"));
}
@Bean(name = "myService")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema mySchema) {
DefaultWsdl11Definition definition = new DefaultWsdl11Definition();
definition.setPortTypeName("MyServicePort");
definition.setTargetNamespace("http://example.com/contract");
definition.setLocationUri("/ws");
definition.setSchema(mySchema);
return definition;
}
}
৫. ডিপ্লয়মেন্ট এবং পরীক্ষা
অ্যাপ্লিকেশন চালু করার পরে তৈরি হওয়া WSDL ফাইল পরীক্ষা করা যায়। উদাহরণস্বরূপ, http://localhost:8080/ws/myService.wsdl থেকে WSDL ফাইল অ্যাক্সেস করা যাবে।
সারাংশ
Spring Web Services এ Contract-First Development একটি স্ট্যান্ডার্ড পদ্ধতি যা ওয়েব সার্ভিসের কার্যকারিতা এবং ডেটা কাঠামো নির্ধারণ করতে XML Schema বা WSDL ব্যবহার করে। এটি সার্ভিস কনজিউমার এবং প্রোভাইডারের মধ্যে স্পষ্ট ও নির্ভরযোগ্য যোগাযোগের সুবিধা প্রদান করে।
Contract-First Development একটি পদ্ধতি যেখানে ওয়েব সার্ভিস তৈরির আগে তার কন্ট্র্যাক্ট (Contract), অর্থাৎ সার্ভিসের কার্যকারিতা, ইনপুট, আউটপুট এবং ডেটা ফরম্যাট সংজ্ঞায়িত করা হয়। এই কন্ট্র্যাক্ট সাধারণত WSDL (Web Services Description Language) বা XML Schema Definition (XSD) এর মাধ্যমে তৈরি করা হয়।
Contract-First Development-এ ডেভেলপমেন্টের শুরুতেই ওয়েব সার্ভিসের কন্ট্র্যাক্ট নির্ধারণ করা হয়, তারপর সেই কন্ট্র্যাক্ট অনুযায়ী সার্ভিস ইমপ্লিমেন্টেশন তৈরি করা হয়।
Contract-First Development-এর বৈশিষ্ট্য
- স্পষ্ট এবং সুনির্দিষ্ট চুক্তি: ক্লায়েন্ট এবং সার্ভারের মধ্যে কীভাবে যোগাযোগ হবে, তা শুরুতেই নির্ধারণ করা হয়।
- অগ্রিম পরিকল্পনা: কন্ট্র্যাক্ট তৈরি হওয়ার কারণে সার্ভিস ইমপ্লিমেন্টেশন শুরু করার আগেই অন্যান্য ডেভেলপার বা টিম কন্ট্র্যাক্টের উপর ভিত্তি করে কাজ শুরু করতে পারে।
- স্বাধীনতা: ক্লায়েন্ট এবং সার্ভার টিম নিজেদের কাজ স্বাধীনভাবে সম্পন্ন করতে পারে, কারণ কন্ট্র্যাক্ট শুরু থেকেই নির্ধারিত থাকে।
Contract-First Development-এর প্রয়োজনীয়তা
স্পষ্ট যোগাযোগ নিশ্চিতকরণ
ক্লায়েন্ট এবং সার্ভার টিমের মধ্যে কীভাবে তথ্য আদান-প্রদান হবে, তা কন্ট্র্যাক্টে নির্ধারণ করে রাখা হয়। এটি ভুল বোঝাবুঝি কমায় এবং উন্নয়ন প্রক্রিয়াকে দ্রুত করে তোলে।
স্ট্যান্ডার্ড এবং ইন্টারঅপারেবিলিটি
Contract-First Development ওয়েব সার্ভিসের জন্য স্ট্যান্ডার্ড ডেটা ফরম্যাট এবং প্রোটোকল ব্যবহার নিশ্চিত করে। এর ফলে ভিন্ন ভিন্ন প্ল্যাটফর্ম এবং ভাষার মধ্যে ডেটা আদান-প্রদান সহজ হয়।
প্রথম থেকেই স্থিতিশীল ডিজাইন
কন্ট্র্যাক্ট নির্ধারণ করার সময় সার্ভিসের কার্যকারিতা এবং ডেটা স্ট্রাকচারের বিবরণ দেওয়া হয়, যা উন্নয়নের সময় স্থিতিশীলতা নিশ্চিত করে।
ক্লায়েন্ট এবং সার্ভারের পৃথক ডেভেলপমেন্ট
কন্ট্র্যাক্ট তৈরি হয়ে গেলে ক্লায়েন্ট টিম এবং সার্ভার টিম নিজেদের কাজ আলাদাভাবে চালিয়ে যেতে পারে। এটি ডেভেলপমেন্টের সময় বাঁচায়।
পুনঃব্যবহারযোগ্যতা
একবার একটি কন্ট্র্যাক্ট তৈরি হলে, সেটি পুনরায় ব্যবহারযোগ্য হয় এবং ভবিষ্যৎ সার্ভিস বা টিমের জন্য সহজে ব্যবহার করা যায়।
Contract-First Development-এর ধাপ
- WSDL বা XML স্কিমা তৈরি করা:
প্রথমে একটি WSDL বা XSD ফাইল তৈরি করে সার্ভিসের কন্ট্র্যাক্ট নির্ধারণ করা হয়। - ক্লায়েন্ট এবং সার্ভার জেনারেশন:
WSDL বা XSD ফাইল থেকে কোড জেনারেট করা হয় যা ক্লায়েন্ট এবং সার্ভার টিমের জন্য ব্যবহৃত হয়। - সার্ভিস ইমপ্লিমেন্টেশন:
কন্ট্র্যাক্ট অনুযায়ী সার্ভিসের কার্যকারিতা বাস্তবায়ন করা হয়। - ইন্টিগ্রেশন এবং টেস্টিং:
ক্লায়েন্ট এবং সার্ভারকে একত্রিত করে টেস্ট করা হয়।
উদাহরণ
একটি XSD ফাইল (Contract) উদাহরণ:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/soap" xmlns="http://example.com/soap">
<xs:element name="GetExampleRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="GetExampleResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="message" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
WSDL থেকে জাভা ক্লাস জেনারেশন:
wsimport -s src -d bin http://example.com/service?wsdl
Contract-First Development বনাম Code-First Development
| বৈশিষ্ট্য | Contract-First Development | Code-First Development |
|---|---|---|
| কন্ট্র্যাক্ট তৈরি | ডেভেলপমেন্টের আগে কন্ট্র্যাক্ট তৈরি হয় | প্রথমে কোড তৈরি হয়, পরে কন্ট্র্যাক্ট জেনারেট করা হয় |
| ইন্টারঅপারেবিলিটি | ভালো ইন্টারঅপারেবিলিটি প্রদান করে | কম ইন্টারঅপারেবিলিটি থাকতে পারে |
| ডিজাইন স্থিতিশীলতা | শুরু থেকেই স্থিতিশীল ডিজাইন নিশ্চিত করে | ডিজাইন পরে পরিবর্তনের প্রয়োজন হতে পারে |
| উন্নয়ন প্রক্রিয়া | পরিকল্পনামূলক এবং সংগঠিত | দ্রুত শুরু করা যায়, তবে পরে সমন্বয়ের প্রয়োজন |
সারাংশ
Contract-First Development হল একটি পদ্ধতি যা উন্নয়ন প্রক্রিয়াকে সুসংগঠিত এবং কার্যকরী করে তোলে। এটি কন্ট্র্যাক্টের মাধ্যমে ক্লায়েন্ট এবং সার্ভারের মধ্যে স্পষ্ট যোগাযোগ স্থাপন করে, ইন্টারঅপারেবিলিটি বাড়ায় এবং উন্নয়ন প্রক্রিয়াকে দ্রুততর ও কার্যকর করে। এটি বড় এন্টারপ্রাইজ সিস্টেমের জন্য অত্যন্ত গুরুত্বপূর্ণ একটি পদ্ধতি।
XSD (XML Schema Definition) ফাইল XML ডেটার স্ট্রাকচার নির্ধারণ এবং বৈধতা যাচাই করার জন্য ব্যবহৃত হয়। স্প্রিং ওয়েব সার্ভিসে XSD ফাইল একটি SOAP ওয়েব সার্ভিসের চুক্তি (Contract) তৈরি করতে ব্যবহৃত হয়। এই ফাইলটি ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা এক্সচেঞ্জের নিয়ম নির্ধারণ করে।
XSD ফাইল কীভাবে কাজ করে?
- ডেটার স্ট্রাকচার নির্ধারণ: XSD ফাইল XML ডেটার উপাদানসমূহ (Elements), অ্যাট্রিবিউটস (Attributes) এবং তাদের টাইপ নির্ধারণ করে।
- SOAP মেসেজ যাচাই: সার্ভার SOAP অনুরোধ এবং প্রতিক্রিয়া যাচাই করার জন্য XSD ফাইল ব্যবহার করে।
- কন্ট্রাক্ট-ফার্স্ট পদ্ধতি: স্প্রিং ওয়েব সার্ভিসে প্রথমে XSD ফাইল তৈরি করা হয় এবং তারপর সেই অনুযায়ী SOAP ওয়েব সার্ভিসের লজিক তৈরি করা হয়।
XSD ফাইল তৈরি
নিচে একটি XSD ফাইলের উদাহরণ দেওয়া হলো, যেখানে একটি ক্যালকুলেটর পরিষেবার জন্য "AddRequest" এবং "AddResponse" ডেটা স্ট্রাকচার সংজ্ঞায়িত করা হয়েছে।
calculator.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://example.com/calculator"
xmlns="http://example.com/calculator" elementFormDefault="qualified">
<xs:element name="AddRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="number1" type="xs:int"/>
<xs:element name="number2" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="AddResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="result" type="xs:int"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
এই XSD ফাইলটি দুটি উপাদান সংজ্ঞায়িত করে:
- AddRequest: দুটি সংখ্যা (
number1এবংnumber2) ধারণ করে। - AddResponse: একটি ফলাফল (
result) প্রদান করে।
স্প্রিং ওয়েব সার্ভিসে XSD ব্যবহার
১. Maven ডিপেনডেন্সি যোগ করা
আপনার প্রজেক্টে Spring WS ব্যবহার করতে নিচের Maven ডিপেনডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>YOUR_VERSION</version>
</dependency>
২. XSD ফাইল রেজিস্টার করা
Spring Configuration ক্লাসে XSD ফাইলটি রেজিস্টার করতে হবে।
WebServiceConfig.java
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<>(servlet, "/ws/*");
}
@Bean
public XsdSchema calculatorSchema() {
return new SimpleXsdSchema(new ClassPathResource("calculator.xsd"));
}
}
৩. WSDL জেনারেট করা
WSDL ফাইল স্বয়ংক্রিয়ভাবে জেনারেট করতে একটি Bean সংজ্ঞায়িত করতে হবে।
CalculatorWsdlConfig.java
@Bean(name = "calculator")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema calculatorSchema) {
DefaultWsdl11Definition definition = new DefaultWsdl11Definition();
definition.setPortTypeName("CalculatorPort");
definition.setTargetNamespace("http://example.com/calculator");
definition.setLocationUri("/ws");
definition.setSchema(calculatorSchema);
return definition;
}
SOAP মেসেজের উদাহরণ
SOAP অনুরোধ (Request):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cal="http://example.com/calculator">
<soapenv:Header/>
<soapenv:Body>
<cal:AddRequest>
<cal:number1>5</cal:number1>
<cal:number2>10</cal:number2>
</cal:AddRequest>
</soapenv:Body>
</soapenv:Envelope>
SOAP প্রতিক্রিয়া (Response):
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:cal="http://example.com/calculator">
<soapenv:Header/>
<soapenv:Body>
<cal:AddResponse>
<cal:result>15</cal:result>
</cal:AddResponse>
</soapenv:Body>
</soapenv:Envelope>
সারাংশ
XSD ফাইল স্প্রিং ওয়েব সার্ভিসে ডেটার গঠন এবং SOAP মেসেজের ভ্যালিডেশন নিশ্চিত করে। এটি একটি কন্ট্রাক্ট-ফার্স্ট পদ্ধতির ভিত্তি হিসেবে কাজ করে, যা সার্ভার এবং ক্লায়েন্ট উভয়ের জন্য নির্ভরযোগ্য যোগাযোগ নিশ্চিত করে।
JAXB (Java Architecture for XML Binding) হল একটি জাভা API যা XML ডকুমেন্ট এবং জাভা অবজেক্টের মধ্যে ডেটা রূপান্তরের কাজ করে। এটি ডেভেলপারদের XML ডেটা প্রক্রিয়াকরণকে সহজ করে তোলে। JAXB এর মাধ্যমে XML ডেটা জাভা অবজেক্টে (Unmarshalling) এবং জাভা অবজেক্টকে XML ডেটায় (Marshalling) রূপান্তর করা যায়।
স্প্রিং ওয়েব সার্ভিসেসে JAXB এর ব্যবহার
স্প্রিং ওয়েব সার্ভিসেসে JAXB ব্যবহৃত হয় SOAP বা RESTful ওয়েব সার্ভিসে Object/XML Mapping করার জন্য। এটি XML ডেটার সঙ্গে জাভা কোডের মডেল তৈরিতে সহায়তা করে।
JAXB এর মাধ্যমে Object/XML Mapping এর ধাপ
JAXB কনফিগারেশন
মডেল ক্লাস তৈরি
JAXB ব্যবহার করার জন্য প্রথমে একটি জাভা মডেল ক্লাস তৈরি করতে হবে এবং সেটি XML ডেটার জন্য মানানসই করতে হবে। JAXB annotations ব্যবহার করে ক্লাসটি কনফিগার করতে হয়।উদাহরণস্বরূপ:
@XmlRootElement(name = "Employee") public class Employee { private int id; private String name; private double salary; @XmlElement public int getId() { return id; } public void setId(int id) { this.id = id; } @XmlElement public String getName() { return name; } public void setName(String name) { this.name = name; } @XmlElement public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } }Marshalling (Object to XML)
JAXBContext এবং Marshaller ব্যবহার করে জাভা অবজেক্টকে XML ডকুমেন্টে রূপান্তর করা হয়।উদাহরণ:
Employee emp = new Employee(); emp.setId(101); emp.setName("John Doe"); emp.setSalary(75000); JAXBContext context = JAXBContext.newInstance(Employee.class); Marshaller marshaller = context.createMarshaller(); marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); marshaller.marshal(emp, System.out);Unmarshalling (XML to Object)
XML ডেটাকে জাভা অবজেক্টে রূপান্তর করার জন্য Unmarshaller ব্যবহার করা হয়।উদাহরণ:
File file = new File("employee.xml"); JAXBContext context = JAXBContext.newInstance(Employee.class); Unmarshaller unmarshaller = context.createUnmarshaller(); Employee emp = (Employee) unmarshaller.unmarshal(file); System.out.println(emp.getName());
স্প্রিং-WS এ JAXB ইন্টিগ্রেশন
স্প্রিং-WS এ JAXB ব্যবহারের জন্য নিম্নোক্ত ধাপগুলো অনুসরণ করা হয়:
OXM Bean Configuration
স্প্রিং কনফিগারেশনেJaxb2Marshallerব্যবহার করা হয়। এটি XML এবং জাভা অবজেক্টের মধ্যে রূপান্তরের জন্য JAXB এর ক্ষমতা ব্যবহার করে।উদাহরণ:
@Bean public Jaxb2Marshaller marshaller() { Jaxb2Marshaller marshaller = new Jaxb2Marshaller(); marshaller.setPackagesToScan("com.example.model"); return marshaller; }WebServiceTemplate ব্যবহার
WebServiceTemplateএর মাধ্যমে JAXBMarshaller ইন্টিগ্রেশন করে SOAP কল করা হয়।উদাহরণ:
@Bean public WebServiceTemplate webServiceTemplate(Jaxb2Marshaller marshaller) { WebServiceTemplate template = new WebServiceTemplate(); template.setMarshaller(marshaller); template.setUnmarshaller(marshaller); return template; }
JAXB এর সুবিধা
- XML ডেটার সঙ্গে কাজ করার প্রক্রিয়া সহজ করে।
- প্রয়োগ করা সহজ এবং স্প্রিং-WS এর সঙ্গে সুসংগত।
- প্লাগেবল এবং কাস্টমাইজেবল।
- স্কিমা থেকে কোড জেনারেশনের মাধ্যমে কনসিস্টেন্সি নিশ্চিত করে।
JAXB Object/XML Mapping কেন গুরুত্বপূর্ণ
JAXB স্প্রিং ওয়েব সার্ভিসেসে Object/XML Mapping সহজ করে এবং XML এবং জাভা অবজেক্টের মধ্যে কার্যকর যোগাযোগ স্থাপন করে। এর মাধ্যমে ডেভেলপাররা SOAP বার্তা হ্যান্ডলিং এবং ডেটা প্রসেসিং আরও সহজ ও দ্রুত করতে পারে।
Spring Web Services এর Contract-First পদ্ধতি ব্যবহারের মাধ্যমে SOAP ওয়েব সার্ভিস তৈরি করলে WSDL (Web Services Description Language) ডকুমেন্টটি প্রথমে তৈরি হয় এবং এর উপর ভিত্তি করে সার্ভিস ইমপ্লিমেন্ট করা হয়। নিচে একটি বাস্তব উদাহরণসহ এই প্রক্রিয়া বর্ণনা করা হলো:
প্রাথমিক প্রস্তুতি
প্রয়োজনীয় ডিপেন্ডেন্সি
Spring WS ব্যবহার করতে হলে Maven বা Gradle-এ প্রাসঙ্গিক ডিপেন্ডেন্সি যুক্ত করতে হবে। Maven এর জন্য উদাহরণ:
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
<version>2.5.0</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
ধাপ ১: WSDL তৈরি
প্রথমে WSDL ফাইল তৈরি করুন যা ওয়েব সার্ভিসের কাঠামো নির্ধারণ করবে।
student-details.wsdl:
<definitions xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:tns="http://example.com/students"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://example.com/students">
<types>
<xsd:schema targetNamespace="http://example.com/students">
<xsd:element name="GetStudentRequest">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="id" type="xsd:int"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="GetStudentResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="age" type="xsd:int"/>
<xsd:element name="grade" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</types>
<message name="GetStudentRequest">
<part name="parameters" element="tns:GetStudentRequest"/>
</message>
<message name="GetStudentResponse">
<part name="parameters" element="tns:GetStudentResponse"/>
</message>
<portType name="StudentDetailsPort">
<operation name="GetStudentDetails">
<input message="tns:GetStudentRequest"/>
<output message="tns:GetStudentResponse"/>
</operation>
</portType>
<binding name="StudentDetailsBinding" type="tns:StudentDetailsPort">
<soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
<operation name="GetStudentDetails">
<soap:operation soapAction="http://example.com/students/GetStudentDetails"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="StudentDetailsService">
<port name="StudentDetailsPort" binding="tns:StudentDetailsBinding">
<soap:address location="http://localhost:8080/ws"/>
</port>
</service>
</definitions>
ধাপ ২: JAXB কনফিগারেশন এবং ক্লাস জেনারেশন
JAXB মডেল জেনারেট করা
JAXB ব্যবহার করে WSDL থেকে Java ক্লাস জেনারেট করতে হবে। Maven এর জন্য jaxb2-maven-plugin ব্যবহার করা যায়:
pom.xml:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<executions>
<execution>
<goals>
<goal>xjc</goal>
</goals>
<configuration>
<schemaDirectory>${project.basedir}/src/main/resources/wsdl</schemaDirectory>
<outputDirectory>${project.basedir}/src/main/java</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
ধাপ ৩: Spring Configuration ক্লাস তৈরি
SOAP মেসেজ ডিসপ্যাচার এবং WSDL লোকেশন কনফিগার করার জন্য একটি কনফিগারেশন ক্লাস তৈরি করুন।
WebServiceConfig.java:
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@Bean
public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext applicationContext) {
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(applicationContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean<>(servlet, "/ws/*");
}
@Bean(name = "students")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema studentsSchema) {
DefaultWsdl11Definition definition = new DefaultWsdl11Definition();
definition.setPortTypeName("StudentDetailsPort");
definition.setLocationUri("/ws");
definition.setTargetNamespace("http://example.com/students");
definition.setSchema(studentsSchema);
return definition;
}
@Bean
public XsdSchema studentsSchema() {
return new SimpleXsdSchema(new ClassPathResource("student-details.xsd"));
}
}
ধাপ ৪: এন্ডপয়েন্ট তৈরি
StudentEndpoint.java:
@Endpoint
public class StudentEndpoint {
private static final String NAMESPACE_URI = "http://example.com/students";
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "GetStudentRequest")
@ResponsePayload
public GetStudentResponse getStudent(@RequestPayload GetStudentRequest request) {
GetStudentResponse response = new GetStudentResponse();
response.setName("John Doe");
response.setAge(22);
response.setGrade("A");
return response;
}
}
ধাপ ৫: সার্ভিস টেস্ট করা
সার্ভিসটি টেস্ট করতে SOAP ক্লায়েন্ট ব্যবহার করা যেতে পারে, যেমন SoapUI। SOAP রিকোয়েস্ট উদাহরণ:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stu="http://example.com/students">
<soapenv:Header/>
<soapenv:Body>
<stu:GetStudentRequest>
<stu:id>1</stu:id>
</stu:GetStudentRequest>
</soapenv:Body>
</soapenv:Envelope>
SOAP রেসপন্স:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:stu="http://example.com/students">
<soapenv:Header/>
<soapenv:Body>
<stu:GetStudentResponse>
<stu:name>John Doe</stu:name>
<stu:age>22</stu:age>
<stu:grade>A</stu:grade>
</stu:GetStudentResponse>
</soapenv:Body>
</soapenv:Envelope>
সারাংশ
Spring Web Services এর Contract-First পদ্ধতি SOAP ওয়েব সার্ভিসের জন্য উচ্চমানের স্ট্যান্ডার্ড নিশ্চিত করে। উপরের ধাপগুলো অনুসরণ করে আপনি একটি কার্যকর ওয়েব সার্ভিস তৈরি করতে পারবেন।
Read more