উদাহরণ সহ Exception Handling

Spring Web Services এর মধ্যে Exception Handling - স্প্রিং ওয়েব সার্ভিসেস (Spring Web Services) - Java Technologies

268

ভূমিকা

ওয়েব সার্ভিস ডেভেলপমেন্টে Exception Handling একটি গুরুত্বপূর্ণ অংশ। এর মাধ্যমে সঠিক এবং ব্যবহারকারীর জন্য বোঝার উপযোগী ত্রুটি বার্তা প্রদান করা হয়। Spring Web Services-এ SOAP Fault ব্যবহারের মাধ্যমে ত্রুটি মেসেজ পাঠানো হয়।


স্প্রিং ওয়েব সার্ভিসে Exception Handling-এর পদ্ধতি

Spring Web Services-এ SoapFaultException, SoapHeaderException, এবং কাস্টম এক্সসেপশন ম্যানেজ করতে @SoapFault এবং @ExceptionHandler এনোটেশন ব্যবহার করা হয়।


উদাহরণ: Exception Handling সহ SOAP ওয়েব সার্ভিস

আমরা এখানে একটি উদাহরণ দেখব, যেখানে ব্যবহারকারী যদি একটি নির্দিষ্ট শর্ত পূরণ না করে, তাহলে কাস্টম SOAP Fault এর মাধ্যমে ত্রুটি বার্তা প্রদান করা হবে।


ধাপ ১: প্রোজেক্ট স্ট্রাকচার

src
├── main
│   ├── java
│   │   └── com.example.exceptionhandling
│   │       ├── ExceptionHandlingApplication.java
│   │       ├── exception
│   │       │   ├── InvalidNameException.java
│   │       │   ├── ServiceFault.java
│   │       ├── model
│   │       │   ├── HelloRequest.java
│   │       │   ├── HelloResponse.java
│   │       ├── endpoint
│   │       │   └── HelloWorldEndpoint.java
│   │       ├── config
│   │       │   └── WebServiceConfig.java
│   ├── resources
│       ├── application.properties
│       └── wsdl
│           └── HelloWorld.wsdl

ধাপ ২: কাস্টম এক্সসেপশন ক্লাস তৈরি

InvalidNameException.java:

package com.example.exceptionhandling.exception;

public class InvalidNameException extends RuntimeException {
    public InvalidNameException(String message) {
        super(message);
    }
}

ServiceFault.java:

package com.example.exceptionhandling.exception;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ServiceFault", propOrder = {"faultCode", "faultMessage"})
public class ServiceFault {

    private String faultCode;
    private String faultMessage;

    public ServiceFault() {}

    public ServiceFault(String faultCode, String faultMessage) {
        this.faultCode = faultCode;
        this.faultMessage = faultMessage;
    }

    public String getFaultCode() {
        return faultCode;
    }

    public void setFaultCode(String faultCode) {
        this.faultCode = faultCode;
    }

    public String getFaultMessage() {
        return faultMessage;
    }

    public void setFaultMessage(String faultMessage) {
        this.faultMessage = faultMessage;
    }
}

ধাপ ৩: মডেল ক্লাস তৈরি

HelloRequest.java:

package com.example.exceptionhandling.model;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "HelloRequest")
@XmlAccessorType(XmlAccessType.FIELD)
public class HelloRequest {

    @XmlElement(name = "name")
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

HelloResponse.java:

package com.example.exceptionhandling.model;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "HelloResponse")
@XmlAccessorType(XmlAccessType.FIELD)
public class HelloResponse {

    @XmlElement(name = "message")
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

ধাপ ৪: এন্ডপয়েন্ট ক্লাস তৈরি

HelloWorldEndpoint.java:

package com.example.exceptionhandling.endpoint;

import com.example.exceptionhandling.exception.InvalidNameException;
import com.example.exceptionhandling.model.HelloRequest;
import com.example.exceptionhandling.model.HelloResponse;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;

@Endpoint
public class HelloWorldEndpoint {

    private static final String NAMESPACE_URI = "http://example.com/helloworld";

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "HelloRequest")
    @ResponsePayload
    public HelloResponse handleHelloRequest(@RequestPayload HelloRequest request) {
        if (request.getName() == null || request.getName().trim().isEmpty()) {
            throw new InvalidNameException("Name cannot be empty");
        }

        HelloResponse response = new HelloResponse();
        response.setMessage("Hello, " + request.getName() + "!");
        return response;
    }
}

ধাপ ৫: Exception Resolver তৈরি

SoapFaultExceptionResolver.java:

package com.example.exceptionhandling.exception;

import org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver;
import org.springframework.ws.soap.server.endpoint.annotation.FaultCode;
import org.springframework.ws.soap.server.endpoint.annotation.SoapFault;
import org.springframework.ws.soap.SoapFault;
import org.springframework.ws.soap.SoapFaultDetail;
import org.springframework.ws.soap.SoapFaultDetailElement;

import javax.xml.namespace.QName;

public class SoapFaultExceptionResolver extends SoapFaultMappingExceptionResolver {

    @Override
    protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
        if (ex instanceof InvalidNameException) {
            SoapFaultDetail detail = fault.addFaultDetail();
            QName detailName = new QName("http://example.com/helloworld", "InvalidName");
            SoapFaultDetailElement detailElement = detail.addFaultDetailElement(detailName);
            detailElement.addText(ex.getMessage());
        }
    }
}

ধাপ ৬: কনফিগারেশন ক্লাস

WebServiceConfig.java:

package com.example.exceptionhandling.config;

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.soap.server.endpoint.SoapFaultAnnotationExceptionResolver;

@EnableWs
@Configuration
public class WebServiceConfig {

    @Bean
    public ServletRegistrationBean<MessageDispatcherServlet> messageDispatcherServlet(ApplicationContext context) {
        MessageDispatcherServlet servlet = new MessageDispatcherServlet();
        servlet.setApplicationContext(context);
        servlet.setTransformWsdlLocations(true);
        return new ServletRegistrationBean<>(servlet, "/ws/*");
    }

    @Bean
    public SoapFaultAnnotationExceptionResolver exceptionResolver() {
        return new SoapFaultAnnotationExceptionResolver();
    }
}

ধাপ ৭: SOAP Fault Response পরীক্ষা

SOAP Request:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:hell="http://example.com/helloworld">
   <soapenv:Header/>
   <soapenv:Body>
      <hell:HelloRequest>
         <hell:name></hell:name>
      </hell:HelloRequest>
   </soapenv:Body>
</soapenv:Envelope>

SOAP Response (Fault):

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Client</faultcode>
         <faultstring>Name cannot be empty</faultstring>
         <detail>
            <InvalidName xmlns="http://example.com/helloworld">Name cannot be empty</InvalidName>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>

এই উদাহরণটি স্প্রিং ওয়েব সার্ভিসে Exception Handling কীভাবে SOAP Fault বার্তা পাঠাতে ব্যবহার করা হয় তা প্রদর্শন করে। এটি একটি উন্নত ব্যবহারকারীর অভিজ্ঞতা নিশ্চিত করে।

Content added By
Promotion

Are you sure to start over?

Loading...