Spring Web Services এর মধ্যে Exception Handling

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

306

Spring Web Services-এ Exception Handling হল এমন একটি প্রক্রিয়া, যা কোনো ত্রুটি বা ব্যতিক্রমী ঘটনা (Exception) ঘটলে তা ব্যবস্থাপনা করে। এটি SOAP বা RESTful ওয়েব সার্ভিসের স্থিতিশীলতা নিশ্চিত করে এবং ক্লায়েন্টকে নির্দিষ্ট ত্রুটি বার্তা (Error Message) প্রদান করে।


Exception Handling-এর প্রয়োজনীয়তা

  1. ত্রুটি বার্তার নির্ভুলতা: ক্লায়েন্ট যেন স্পষ্ট এবং নির্ভুল ত্রুটি বার্তা পায়।
  2. অবাঞ্ছিত সিস্টেম ক্র্যাশ প্রতিরোধ: Exception সঠিকভাবে হ্যান্ডেল না করলে সার্ভার বন্ধ হয়ে যেতে পারে।
  3. ডিবাগিং সহজতর করা: সঠিক ত্রুটি বার্তা সমস্যার উৎস নির্ধারণ সহজ করে।
  4. ব্যবহারকারীর অভিজ্ঞতা উন্নত করা: ত্রুটি ব্যবস্থাপনা করলে সার্ভিস আরও নির্ভরযোগ্য হয়।

Spring Web Services-এ Exception Handling পদ্ধতি

Spring Web Services-এ Exception Handling প্রধানত নিচের পদ্ধতিগুলো অনুসরণ করে:

@SoapFault ব্যবহার করে

SOAP প্রোটোকলের সাথে সামঞ্জস্য রেখে ত্রুটি বার্তা তৈরি করতে Spring-WS-এ @SoapFault annotation ব্যবহার করা হয়।

Custom Exception এবং Exception Resolver

Custom Exception এবং Spring Framework-এ উপলব্ধ SoapFaultMappingExceptionResolver ব্যবহার করে বিস্তারিত ত্রুটি বার্তা তৈরি করা যায়।

Fault ডিটেইল যোগ করা

SOAP ফল্ট (Fault) মেসেজে অতিরিক্ত ডিটেইল যোগ করার মাধ্যমে Exception-এর উৎস এবং ধরন সম্পর্কে আরও তথ্য প্রদান করা হয়।


Custom Exception তৈরি

Custom Exception তৈরি করে নির্দিষ্ট ত্রুটি নির্দেশ করা যায়।

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

SOAP Fault Mapping Exception Resolver কনফিগারেশন

Spring Web Services-এ SoapFaultMappingExceptionResolver ব্যবহার করে ত্রুটির ধরন অনুযায়ী SOAP Fault তৈরি করা যায়।

@Bean
public SoapFaultMappingExceptionResolver exceptionResolver() {
    SoapFaultMappingExceptionResolver resolver = new SoapFaultMappingExceptionResolver();

    // ত্রুটির ম্যাপিং কনফিগার করুন
    Properties errorMappings = new Properties();
    errorMappings.setProperty(ExampleNotFoundException.class.getName(), SoapFaultDefinition.CLIENT.toString());
    resolver.setExceptionMappings(errorMappings);

    resolver.setDefaultFault(new SoapFaultDefinition());
    resolver.getDefaultFault().setFaultCode(SoapFaultDefinition.SERVER);

    return resolver;
}

Exception Handling এন্ডপয়েন্টে যুক্ত করা

SOAP এন্ডপয়েন্টে ত্রুটি হ্যান্ডল করার জন্য Exception তৈরি এবং তা সঠিকভাবে SOAP Fault-এ রূপান্তর করুন।

@Endpoint
public class ExampleEndpoint {

    @PayloadRoot(namespace = "http://example.com/ws", localPart = "GetExampleRequest")
    @ResponsePayload
    public GetExampleResponse handleRequest(@RequestPayload GetExampleRequest request) {
        if (request.getId() < 0) {
            throw new ExampleNotFoundException("Invalid ID: " + request.getId());
        }

        GetExampleResponse response = new GetExampleResponse();
        response.setMessage("Valid ID: " + request.getId());
        return response;
    }
}

Fault Detail যোগ করা

SOAP Fault মেসেজে ডিটেইল যোগ করতে SoapFaultException ব্যবহার করা হয়।

@Endpoint
public class ExampleEndpoint {

    @PayloadRoot(namespace = "http://example.com/ws", localPart = "GetExampleRequest")
    @ResponsePayload
    public GetExampleResponse handleRequest(@RequestPayload GetExampleRequest request) throws SoapFaultException {
        if (request.getId() < 0) {
            SoapFault fault = SoapFaultDefinition.CLIENT.createFault("Invalid ID provided.");
            fault.addFaultDetail().addFaultEntry("ErrorCode", "ID_NEGATIVE");
            throw new SoapFaultException(fault);
        }

        GetExampleResponse response = new GetExampleResponse();
        response.setMessage("Valid ID: " + request.getId());
        return response;
    }
}

@SoapFault Annotation ব্যবহার

Custom Exception-এ @SoapFault annotation ব্যবহার করে সহজেই Fault Code নির্ধারণ করা যায়।

@SoapFault(faultCode = FaultCode.CLIENT)
public class ExampleNotFoundException extends RuntimeException {
    public ExampleNotFoundException(String message) {
        super(message);
    }
}

Exception Logging

Spring Web Services-এ Exception Logging করতে Spring Framework-এর Logger ব্যবহার করা হয়। উদাহরণ:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Endpoint
public class ExampleEndpoint {
    private static final Logger logger = LoggerFactory.getLogger(ExampleEndpoint.class);

    @PayloadRoot(namespace = "http://example.com/ws", localPart = "GetExampleRequest")
    @ResponsePayload
    public GetExampleResponse handleRequest(@RequestPayload GetExampleRequest request) {
        try {
            if (request.getId() < 0) {
                throw new ExampleNotFoundException("Invalid ID: " + request.getId());
            }

            GetExampleResponse response = new GetExampleResponse();
            response.setMessage("Valid ID: " + request.getId());
            return response;

        } catch (ExampleNotFoundException e) {
            logger.error("Exception occurred: {}", e.getMessage());
            throw e;
        }
    }
}

সারাংশ

Spring Web Services-এ Exception Handling SOAP মেসেজিংয়ের একটি অপরিহার্য অংশ। Custom Exception, SoapFaultMappingExceptionResolver, এবং Fault Detail ব্যবহার করে ডেভেলপাররা ক্লায়েন্টকে সুনির্দিষ্ট ত্রুটি বার্তা প্রদান করতে পারে। এটি অ্যাপ্লিকেশনকে আরও নির্ভরযোগ্য এবং ব্যবহারকারীর জন্য উন্নত অভিজ্ঞতা প্রদান করে।

Content added By

ওয়েব সার্ভিস ডেভেলপমেন্টে Exception Handling একটি গুরুত্বপূর্ণ বিষয়। এটি কোনো ত্রুটি (error) সনাক্ত করা এবং তা সঠিকভাবে পরিচালনা করার প্রক্রিয়া। স্প্রিং ওয়েব সার্ভিসে Exception Handling-কে এমনভাবে ডিজাইন করা হয়েছে যাতে SOAP বার্তা প্রক্রিয়াকরণের সময় ক্লায়েন্ট এবং সার্ভারের মধ্যে ত্রুটির তথ্য সঠিকভাবে আদান-প্রদান করা যায়।


Exception Handling এর গুরুত্ব

  • ব্যবহারকারীকে ত্রুটির কারণ জানানো: ক্লায়েন্টকে উপযুক্ত ত্রুটির বার্তা প্রদান করা।
  • ত্রুটির ধরন আলাদা করা: সাধারণ ত্রুটি এবং ক্রিটিক্যাল ত্রুটি আলাদা করা।
  • অ্যাপ্লিকেশনের স্থিতিশীলতা: ত্রুটি সনাক্ত করে অ্যাপ্লিকেশন ক্র্যাশ হওয়া এড়ানো।
  • ডিবাগিং সহজ করা: ত্রুটির তথ্য লগ করে সমস্যা সমাধান সহজ করা।

স্প্রিং ওয়েব সার্ভিসে Exception Handling এর প্রক্রিয়া

SOAPFaultException

স্প্রিং ওয়েব সার্ভিসে ত্রুটির তথ্য ক্লায়েন্টকে পাঠানোর জন্য SOAPFaultException ব্যবহার করা হয়। এটি SOAP বার্তার মাধ্যমে ক্লায়েন্টকে ত্রুটির বিবরণ পাঠায়।

WebServiceException

WebServiceException ক্লাসটি সাধারণ ত্রুটির জন্য ব্যবহৃত হয় যা SOAP বার্তার মাধ্যমে প্রেরণ করা হয় না।

Custom Exception ব্যবহার

ওয়েব সার্ভিসের নির্দিষ্ট ত্রুটিগুলোর জন্য কাস্টম এক্সসেপশন তৈরি করা হয়।


Exception Handling ইমপ্লিমেন্টেশন

১. কাস্টম Exception তৈরি করা

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

২. SOAPFault তৈরি করা

import javax.xml.ws.soap.SOAPFaultException;
import javax.xml.soap.SOAPFactory;
import javax.xml.soap.SOAPFault;

@Endpoint
public class EmployeeEndpoint {

    @PayloadRoot(namespace = "http://example.com/namespace", localPart = "GetEmployeeRequest")
    public GetEmployeeResponse getEmployee(GetEmployeeRequest request) {
        if (request.getId() <= 0) {
            throw createSOAPFaultException("Invalid Employee ID: " + request.getId());
        }

        // যদি সঠিক ID হয়, তখন ডেটা রিটার্ন করুন
        GetEmployeeResponse response = new GetEmployeeResponse();
        response.setName("John Doe");
        return response;
    }

    private SOAPFaultException createSOAPFaultException(String message) {
        try {
            SOAPFault fault = SOAPFactory.newInstance().createFault();
            fault.setFaultString(message);
            return new SOAPFaultException(fault);
        } catch (Exception e) {
            throw new RuntimeException("Error creating SOAP Fault", e);
        }
    }
}

৩. @ExceptionHandler ব্যবহার

স্প্রিং এর @ExceptionHandler অ্যানোটেশন ব্যবহার করে কাস্টম এক্সসেপশন পরিচালনা করা যায়।

@ControllerAdvice
public class SoapExceptionHandler {

    @ExceptionHandler(EmployeeNotFoundException.class)
    public ResponseEntity<String> handleEmployeeNotFoundException(EmployeeNotFoundException ex) {
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);
    }
}

৪. SOAPFaultMappingExceptionResolver ব্যবহার

SOAPFaultMappingExceptionResolver ক্লাস স্প্রিং ওয়েব সার্ভিসের মধ্যে Exception Handling সহজ করে। এটি SOAPFault তৈরি এবং ক্লায়েন্টের কাছে পাঠানোর কাজ করে।

কনফিগারেশন:

@Bean
public SOAPFaultMappingExceptionResolver exceptionResolver() {
    SOAPFaultMappingExceptionResolver resolver = new SOAPFaultMappingExceptionResolver();

    Properties errorMappings = new Properties();
    errorMappings.setProperty(EmployeeNotFoundException.class.getName(), "CLIENT");

    resolver.setExceptionMappings(errorMappings);
    resolver.setDefaultFault(fault -> fault.setFaultString("An unknown error occurred"));

    return resolver;
}

SOAP বার্তার আউটপুট উদাহরণ

ক্লায়েন্টকে SOAP বার্তায় ত্রুটির তথ্য পাঠানোর সময় নিম্নরূপ বার্তা তৈরি হয়:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Client</faultcode>
            <faultstring>Invalid Employee ID: -1</faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Exception Handling এর সেরা পদ্ধতি

  • কাস্টম এক্সসেপশন ব্যবহার করুন: নির্দিষ্ট ত্রুটির জন্য আলাদা এক্সসেপশন তৈরি করা।
  • SOAPFaultException এড়িয়ে চলুন যেখানে সম্ভব: এটি বেশি কমপ্লেক্স হলে @ExceptionHandler বা অন্য পদ্ধতি ব্যবহার করুন।
  • লগিং নিশ্চিত করুন: সার্ভারে সব ত্রুটির তথ্য লগ করে রাখা।
  • ব্যবহারকারী-বান্ধব বার্তা প্রদান করুন: ক্লায়েন্টকে সঠিক এবং সহজবোধ্য ত্রুটির বার্তা দিন।

সারাংশ:
স্প্রিং ওয়েব সার্ভিসে Exception Handling ক্লায়েন্ট এবং সার্ভারের মধ্যে ত্রুটি যোগাযোগকে সহজ করে তোলে। SOAPFaultException, Custom Exception, এবং @ExceptionHandler ব্যবহার করে কার্যকরভাবে Exception পরিচালনা করা যায়। এটি সঠিক বার্তা প্রদান এবং সার্ভারের স্থিতিশীলতা নিশ্চিত করতে সহায়ক।

Content added By

SOAP Fault হল একটি স্ট্যান্ডার্ড প্রক্রিয়া যা SOAP মেসেজের মাধ্যমে ত্রুটি বা সমস্যা সম্পর্কে ক্লায়েন্টকে অবহিত করে। Spring Web Services এই ফিচারটি সমর্থন করে, যা ত্রুটির সময় ডেভেলপারদের আরও কার্যকর উপায়ে সমস্যা হ্যান্ডল করতে সাহায্য করে।

SOAP Fault দুটি প্রধান উপাদানে বিভক্ত:

  1. Fault Code: ত্রুটির ধরন ব্যাখ্যা করে।
  2. Fault String: ত্রুটির বিবরণ প্রদান করে।

SOAP Fault তৈরি করার পদ্ধতি

Spring Web Services-এ SOAP Fault তৈরি করতে SoapFault অবজেক্ট ব্যবহার করা হয়।

উদাহরণ: SOAP Fault তৈরি করা

Spring WS-এ ত্রুটি তৈরি করার জন্য একটি Endpoint-এ ত্রুটি হ্যান্ডলিং কোড যোগ করতে হবে।

Endpoint ক্লাস:

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;
import org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver;
import org.springframework.ws.soap.SoapFault;
import org.springframework.ws.soap.SoapFaultException;

@Endpoint
public class MyServiceEndpoint {

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

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "MyRequest")
    @ResponsePayload
    public MyResponse handleRequest(@RequestPayload MyRequest request) {
        if (request.getId() == null) {
            throw new SoapFaultException("ID cannot be null");
        }

        MyResponse response = new MyResponse();
        response.setMessage("Request processed successfully");
        return response;
    }
}

SOAP Fault Exception Resolver কনফিগার করা

Spring WS-এ ত্রুটি হ্যান্ডল করার জন্য SoapFaultMappingExceptionResolver ব্যবহার করা যায়। এটি কাস্টম ত্রুটি বার্তা তৈরি করে।

Configuration Class:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.ws.soap.server.endpoint.SoapFaultMappingExceptionResolver;
import org.springframework.ws.soap.SoapFault;

@Configuration
public class SoapFaultConfig {

    @Bean
    public SoapFaultMappingExceptionResolver exceptionResolver() {
        SoapFaultMappingExceptionResolver resolver = new SoapFaultMappingExceptionResolver();
        resolver.setDefaultFault(() -> {
            SoapFault fault = new SoapFault("Server error", Locale.ENGLISH);
            fault.addFaultDetail().addFaultEntry("ErrorDetails", "Details about the error");
            return fault;
        });
        return resolver;
    }
}

কাস্টম SOAP Fault তৈরি করা

কাস্টম SOAP Fault তৈরি করতে Spring WS-এর SoapFault ইন্টারফেস ব্যবহার করতে হবে।

Example:

import org.springframework.ws.soap.SoapBody;
import org.springframework.ws.soap.SoapFault;
import org.springframework.ws.soap.SoapMessage;
import javax.xml.transform.stream.StreamResult;
import java.io.StringWriter;

public class SoapFaultHelper {

    public static String createSoapFault(String faultCode, String faultMessage) {
        StringWriter writer = new StringWriter();
        SoapFault soapFault = new SoapFault(faultCode, faultMessage, Locale.ENGLISH);
        soapFault.addFaultDetail().addFaultEntry("Details", "Invalid input provided");
        soapFault.writeTo(new StreamResult(writer));
        return writer.toString();
    }
}

ত্রুটি হ্যান্ডলিং

Spring Web Services ত্রুটি হ্যান্ডল করার জন্য @ExceptionHandler বা SOAP-specific Exception Resolver ব্যবহার করতে পারে।

Exception Handler Example:

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

@SoapFault(faultCode = FaultCode.CLIENT)
public class InvalidRequestException extends RuntimeException {

    public InvalidRequestException(String message) {
        super(message);
    }
}

Endpoint with Exception Handling:

@Endpoint
public class MyEndpoint {

    @PayloadRoot(namespace = "http://example.com/schema", localPart = "Request")
    public Response handleRequest(Request request) {
        if (request.getValue() == null) {
            throw new InvalidRequestException("Value cannot be null");
        }
        return new Response("Success");
    }
}

SOAP Fault এর উদাহরণ (XML ফরম্যাট)

SOAP Fault ক্লায়েন্টের কাছে নিম্নলিখিত XML ফরম্যাটে পাঠানো হয়:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Client</faultcode>
            <faultstring>Invalid input provided</faultstring>
            <detail>
                <ErrorDetails>
                    Details about the error
                </ErrorDetails>
            </detail>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

সারাংশ

SOAP Fault Spring Web Services-এ ত্রুটি হ্যান্ডল করার একটি স্ট্যান্ডার্ড উপায়। এটি ত্রুটি সংক্রান্ত তথ্য ক্লায়েন্টকে পাঠানোর পাশাপাশি সার্ভার-সাইড সমস্যা শনাক্ত করতেও সহায়তা করে। Spring WS ত্রুটি হ্যান্ডলিং এবং কাস্টমাইজেশনের জন্য উন্নত ফিচার সরবরাহ করে।

Content added By

Spring Web Services (Spring WS) ব্যবহার করার সময় এমন কিছু পরিস্থিতি তৈরি হতে পারে, যেখানে কাস্টম এক্সসেপশন (Custom Exception) তৈরি এবং গ্লোবাল এক্সসেপশন হ্যান্ডলিংয়ের প্রয়োজন হয়। এটি ডেভেলপমেন্ট প্রক্রিয়াকে আরও কাঠামোবদ্ধ এবং কার্যকর করে।


Custom Exception তৈরি করা

কেন Custom Exception প্রয়োজন?

  • নির্দিষ্ট ধরণের ত্রুটি সনাক্তকরণ এবং হ্যান্ডলিং।
  • ত্রুটি মেসেজকে আরও অর্থবহ এবং ডেভেলপার-ফ্রেন্ডলি করা।
  • SOAP মেসেজে কাস্টম ফল্ট (Fault) মেসেজ প্রদান।

Custom Exception উদাহরণ

public class UserNotFoundException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    public UserNotFoundException(String message) {
        super(message);
    }
}

SOAP Fault তৈরি করা

SOAP ওয়েব সার্ভিসে কাস্টম এক্সসেপশন হ্যান্ডল করতে SOAP Fault ব্যবহার করা হয়। এটি SOAP এর মাধ্যমে ক্লায়েন্টকে ত্রুটি সম্পর্কিত তথ্য প্রেরণ করে।

SOAP Fault কনফিগারেশন

@Endpoint
public class UserDetailsEndpoint {
    private static final String NAMESPACE_URI = "http://example.com/users";

    @PayloadRoot(namespace = NAMESPACE_URI, localPart = "GetUserDetailsRequest")
    @ResponsePayload
    public GetUserDetailsResponse getUserDetails(@RequestPayload GetUserDetailsRequest request) {
        if (request.getUserId() <= 0) {
            throw new UserNotFoundException("User not found with ID: " + request.getUserId());
        }

        GetUserDetailsResponse response = new GetUserDetailsResponse();
        response.setName("John Doe");
        response.setEmail("john.doe@example.com");
        return response;
    }
}

Global Exception Handling

Spring WS গ্লোবাল এক্সসেপশন হ্যান্ডল করার জন্য @ControllerAdvice ব্যবহার করে। এটি সমস্ত এক্সসেপশনকে একটি কেন্দ্রীভূত জায়গায় হ্যান্ডল করার সুযোগ দেয়।

Exception Resolver কনফিগারেশন

@Configuration
@EnableWs
public class WebServiceConfig extends WsConfigurerAdapter {
    @Bean
    public SoapFaultMappingExceptionResolver exceptionResolver() {
        SoapFaultMappingExceptionResolver exceptionResolver = new SoapFaultMappingExceptionResolver();

        Properties errorMappings = new Properties();
        errorMappings.setProperty(UserNotFoundException.class.getName(), SoapFaultDefinition.SERVER);
        exceptionResolver.setExceptionMappings(errorMappings);
        exceptionResolver.setDefaultFault(SoapFaultDefinition.SERVER);
        exceptionResolver.setOrder(1);
        return exceptionResolver;
    }
}

Custom Exception হ্যান্ডলিং গ্লোবালি কনফিগার করা

SOAP মেসেজে Fault Message প্রদান করতে, একটি @ControllerAdvice বা @EndpointExceptionResolver ব্যবহার করা হয়।

উদাহরণ: Exception Resolver

@Component
public class CustomSoapFaultExceptionResolver extends AbstractSoapFaultDefinitionExceptionResolver {

    @Override
    protected void customizeFault(Object endpoint, Exception ex, SoapFault fault) {
        if (ex instanceof UserNotFoundException) {
            fault.setFaultStringOrReason(ex.getMessage());
        }
    }
}

SOAP Fault Response উদাহরণ

SOAP ক্লায়েন্ট যদি একটি ভুল অনুরোধ পাঠায়, তবে নিচের মতো একটি SOAP Fault Response পাওয়া যাবে:

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <faultcode>SOAP-ENV:Server</faultcode>
            <faultstring>User not found with ID: -1</faultstring>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

সারাংশ

Spring Web Services-এ Custom Exception এবং Global Exception Handling ডেভেলপারদের এন্টারপ্রাইজ-গ্রেড SOAP সার্ভিস তৈরি করতে সাহায্য করে। এটি ত্রুটি সনাক্তকরণ ও হ্যান্ডলিংকে আরও কার্যকর এবং ক্লায়েন্টদের জন্য প্রাসঙ্গিক ফল্ট মেসেজ প্রদান নিশ্চিত করে।


Content added By

ভূমিকা

ওয়েব সার্ভিস ডেভেলপমেন্টে 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...