বৈধকরণ বার্তার জায়গায় বসন্ত বুটে "অভ্যন্তরীণ সার্ভার ত্রুটি" ব্যবহার করা

বৈধকরণ বার্তার জায়গায় বসন্ত বুটে অভ্যন্তরীণ সার্ভার ত্রুটি ব্যবহার করা
বৈধকরণ বার্তার জায়গায় বসন্ত বুটে অভ্যন্তরীণ সার্ভার ত্রুটি ব্যবহার করা

কেন কাস্টম বৈধকরণ ত্রুটিগুলি স্প্রিং বুটে প্রদর্শিত হয় না৷

ব্যবহারকারীর নিবন্ধন পরিচালনা করে এমন একটি স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করার সময়, বিকাশকারীরা প্রায়শই ডেটা অখণ্ডতা নিশ্চিত করার জন্য বৈধতা টীকাগুলির উপর নির্ভর করে। এই বৈধতাগুলি নিশ্চিত করতে সাহায্য করে যে প্রথম নাম, পদবি এবং ইমেলের মতো প্রয়োজনীয় ক্ষেত্রগুলি খালি না রাখা হয়৷ যাইহোক, যখন যাচাইকরণ ত্রুটিগুলি সঠিকভাবে ব্যবহারকারীর কাছে প্রদর্শিত না হয় তখন সমস্যা দেখা দিতে পারে, এর পরিবর্তে একটি জেনেরিক "অভ্যন্তরীণ সার্ভার ত্রুটি" দেখা দেয়।

এই সমস্যাটি সাধারণত কন্ট্রোলারে ভুল ত্রুটি হ্যান্ডলিং থেকে উদ্ভূত হয়, যেখানে বাইন্ডিং ফলাফল সঠিকভাবে প্রক্রিয়া করা নাও হতে পারে। আপনি যদি "প্রথম নামটি শূন্য হতে পারে না" এর মতো নির্দিষ্ট ত্রুটির বার্তাগুলি আশা করেন তবে এর পরিবর্তে একটি 500 ত্রুটি পান, তাহলে আপনার বৈধতা কীভাবে প্রয়োগ করা হচ্ছে তা নিয়ে একটি সমস্যা হতে পারে৷

এই সমস্যাটি সমাধান করার জন্য, এটি নিশ্চিত করা গুরুত্বপূর্ণ যে বৈধকরণ টীকা যেমন @NotNul এবং @নটব্ল্যাঙ্ক সঠিকভাবে প্রক্রিয়া করা হয় এবং সেই ত্রুটির প্রতিক্রিয়াগুলি ক্যাপচার করা হয় এবং একটি ব্যবহারকারী-বান্ধব বিন্যাসে ফেরত দেওয়া হয়। উপরন্তু, হ্যান্ডেল করার জন্য আপনার কন্ট্রোলারে সঠিক কনফিগারেশন বাইন্ডিং রেজাল্ট ত্রুটি অপরিহার্য।

এই নিবন্ধে, আমরা স্প্রিং বুট অ্যাপ্লিকেশনগুলিতে কেন এই ধরনের সমস্যাগুলি দেখা দেয় এবং আপনি কীভাবে সেগুলি ঠিক করতে পারেন তা অন্বেষণ করব। আমরা ত্রুটি পরিচালনার ক্ষেত্রে সাধারণ ত্রুটিগুলি পরীক্ষা করব এবং বৈধতা ব্যর্থ হলে "অভ্যন্তরীণ সার্ভার ত্রুটি" এড়াতে সর্বোত্তম অনুশীলনের মাধ্যমে চলব।

আদেশ ব্যবহারের উদাহরণ
@RestControllerAdvice এই টীকাটি স্প্রিং বুটে একটি বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলারকে সংজ্ঞায়িত করতে ব্যবহৃত হয়। এটি আপনাকে প্রতিটি কন্ট্রোলারে পৃথকভাবে পরিচালনা করার পরিবর্তে সমগ্র অ্যাপ্লিকেশনের ব্যতিক্রমগুলিকে কেন্দ্রীভূত উপায়ে পরিচালনা করতে দেয়।
@ExceptionHandler(MethodArgumentNotValidException.class) নির্দিষ্ট ব্যতিক্রমগুলি পরিচালনা করার জন্য একটি পদ্ধতি নির্দিষ্ট করে, এই ক্ষেত্রে, যখন একটি অনুরোধে অবৈধ ডেটা থাকে তখন বৈধতা ত্রুটিগুলি নিক্ষিপ্ত হয়৷ এটি বিশ্বব্যাপী এই ত্রুটিগুলি ক্যাপচার করে এবং একটি কাঠামোগত প্রতিক্রিয়া নিশ্চিত করে৷
MethodArgumentNotValidException এই ব্যতিক্রমটি ট্রিগার হয় যখন @Valid-এর সাথে টীকাযুক্ত একটি আর্গুমেন্টের বৈধতা ব্যর্থ হয়। এটি একটি একক অনুরোধে সমস্ত বৈধতা ত্রুটি ক্যাপচার করে, যা পরবর্তীতে আরও প্রক্রিয়া করা যেতে পারে।
BindingResult একটি ইন্টারফেস যা স্প্রিং-এ একটি বৈধতা যাচাইয়ের ফলাফল ধারণ করে। এটিতে এমন ত্রুটি রয়েছে যা অনুরোধের মূল অংশটি যাচাই করার সময় ঘটে, যা আপনাকে প্রোগ্রামগতভাবে বৈধতা ত্রুটিগুলি পরিদর্শন করতে সক্ষম করে৷
FieldError স্প্রিং-এর একটি ক্লাস যা বৈধকরণের সময় একটি নির্দিষ্ট ক্ষেত্রের সাথে সম্পর্কিত একটি ত্রুটি উপস্থাপন করে। এটি ক্ষেত্রের নাম এবং সংশ্লিষ্ট বৈধতা ত্রুটি বার্তার মতো বিবরণ সঞ্চয় করে, এটি অর্থপূর্ণ ত্রুটি বার্তাগুলিকে নিষ্কাশন করা এবং ফেরত দেওয়া সহজ করে তোলে।
getBindingResult().getAllErrors() এই পদ্ধতিটি BindingResult অবজেক্ট থেকে সমস্ত বৈধতা ত্রুটি পুনরুদ্ধার করে। এটি ObjectError উদাহরণগুলির একটি তালিকা প্রদান করে, যা কাস্টম ত্রুটি প্রতিক্রিয়া তৈরি করতে প্রক্রিয়া করা যেতে পারে।
Map<String, String> জাভাতে কী-মানের জোড়া সঞ্চয় করতে ব্যবহৃত একটি ডেটা কাঠামো। এই প্রেক্ষাপটে, এটি সহজ ত্রুটি রিপোর্ট করার জন্য তাদের সংশ্লিষ্ট বৈধতা ত্রুটি বার্তাগুলি (মান হিসাবে) ক্ষেত্রের নামগুলি (কী হিসাবে) ম্যাপ করতে ব্যবহৃত হয়।
ResponseEntity<?> এই ক্লাসটি বসন্তে একটি HTTP প্রতিক্রিয়া উপস্থাপন করে। এটি আপনাকে রেসপন্স বডি এবং ক্লায়েন্টের কাছে ফিরে আসা HTTP স্ট্যাটাস কোড উভয়ই নিয়ন্ত্রণ করতে দেয়, এটি 400 খারাপ অনুরোধের মতো উপযুক্ত স্ট্যাটাস কোড সহ কাস্টম বৈধতা ত্রুটি বার্তা পাঠানোর জন্য আদর্শ করে তোলে।

স্প্রিং বুটে ত্রুটি হ্যান্ডলিং এবং বৈধতা বোঝা

পূর্ববর্তী উদাহরণে প্রদত্ত স্ক্রিপ্টগুলি স্প্রিং বুট অ্যাপ্লিকেশনগুলিতে বৈধতার সমস্যাটি পরিচালনা করার জন্য ডিজাইন করা হয়েছে। বিশেষভাবে, তারা নিশ্চিত করার উপর ফোকাস করে যে যখন একটি বৈধতা ত্রুটি ঘটে - যেমন যখন প্রথম নামটি অনুপস্থিত থাকে - একটি সাধারণ "অভ্যন্তরীণ সার্ভার ত্রুটি" এর পরিবর্তে ব্যবহারকারীকে একটি উপযুক্ত ত্রুটি বার্তা ফেরত দেওয়া হয়। প্রথম স্ক্রিপ্ট এর সাথে বৈধতা নিয়োগ করে @বৈধ কন্ট্রোলার পদ্ধতিতে টীকা, স্প্রিং বুটকে স্বয়ংক্রিয়ভাবে অনুরোধের মূল অংশটি যাচাই করার অনুমতি দেয়। যখন বৈধতা ব্যর্থ হয়, এটি এর মাধ্যমে ত্রুটি বার্তা ক্যাপচার করে বাইন্ডিং রেজাল্ট ইন্টারফেস, যা যাচাইকরণের ফলাফল ধারণ করে এবং "প্রথম নাম নাল হতে পারে না" এর মত নির্দিষ্ট বার্তা বের করার অনুমতি দেয়।

সমাধান আরেকটি গুরুত্বপূর্ণ উপাদান হল প্রতিক্রিয়াশীলতা ক্লাস এটি একটি স্ট্যাটাস কোড সহ একটি HTTP প্রতিক্রিয়া ফেরাতে ব্যবহৃত হয়। বৈধতা ত্রুটির ক্ষেত্রে, কোড সেট করা হয় HttpStatus.BAD_REQUEST (400), নির্দেশ করে যে ক্লায়েন্ট একটি অবৈধ অনুরোধ পাঠিয়েছে। কন্ট্রোলার থেকে প্রথম ত্রুটির বার্তা বের করে বাঁধাই ফলাফল এবং এটি প্রতিক্রিয়া বডিতে ক্লায়েন্টের কাছে ফেরত পাঠায়, নিশ্চিত করে যে ব্যবহারকারী বুঝতে পারে কি ভুল হয়েছে। এই পদ্ধতিটি একটি অভ্যন্তরীণ সার্ভার ত্রুটি ট্রিগার না করে অনুপস্থিত বা অবৈধ ডেটার জন্য একটি পরিষ্কার এবং ব্যবহারকারী-বান্ধব প্রতিক্রিয়া প্রদান করে৷

দ্বিতীয় স্ক্রিপ্টটি a ব্যবহার করে আরও মাপযোগ্য সমাধান উপস্থাপন করে GlobalExceptionHandler সঙ্গে @RestControllerAdvice টীকা এই পদ্ধতিটি আমাদের সম্পূর্ণ অ্যাপ্লিকেশন জুড়ে ব্যতিক্রমগুলি পরিচালনা করে এমন পদ্ধতিগুলিকে সংজ্ঞায়িত করার অনুমতি দিয়ে ত্রুটি-হ্যান্ডলিং যুক্তিকে কেন্দ্রীভূত করে। যখন ক MethodArgumentNotValidException বৈধতা ত্রুটির কারণে নিক্ষিপ্ত হয়, গ্লোবাল হ্যান্ডলার ব্যতিক্রমটি বাধা দেয় এবং এটি প্রক্রিয়া করে, সামঞ্জস্যপূর্ণ ত্রুটি প্রতিক্রিয়া নিশ্চিত করে। এটি ত্রুটি-হ্যান্ডলিং লজিককে পুনরায় ব্যবহারযোগ্য এবং বজায় রাখা সহজ করে তোলে, বিশেষ করে একাধিক কন্ট্রোলার সহ অ্যাপ্লিকেশনগুলিতে।

উভয় পদ্ধতিতে, আমরা একটি ব্যবহার করি মানচিত্র কী হিসাবে ক্ষেত্রের নাম এবং মান হিসাবে তাদের সংশ্লিষ্ট ত্রুটি বার্তা সংরক্ষণ করতে। এটি অ্যাপ্লিকেশনটিকে একটি কাঠামোগত বিন্যাসে একাধিক বৈধতা ত্রুটি ফেরত দেওয়ার অনুমতি দেয়৷ এই পদ্ধতিটি ব্যবহারকারীর প্রতিক্রিয়া উন্নত করে এবং ডেভেলপারদের জন্য বৈধতা যুক্তি পরিচালনা করা সহজ করে তোলে। ব্যবহারের পছন্দ বাইন্ডিং রেজাল্ট এক পদ্ধতিতে এবং ক GlobalExceptionHandler অন্যটি নিশ্চিত করে যে সমাধানগুলি বিভিন্ন পরিস্থিতিতে কভার করে, প্রকল্পের প্রয়োজনের উপর নির্ভর করে নমনীয়তা প্রদান করে।

স্প্রিং বুটে বৈধতা বার্তার পরিবর্তে অভ্যন্তরীণ সার্ভার ত্রুটি পরিচালনা করা

এই সমাধানটি জাভাতে সঠিক ত্রুটি পরিচালনার কৌশল এবং সেরা অনুশীলনগুলি ব্যবহার করে স্প্রিং বুট ব্যাকএন্ডে বৈধতা ত্রুটিগুলি কীভাবে পরিচালনা করতে হয় তা প্রদর্শন করে।

package com.registration.RegistrationManagementAPI.controllers;
import com.registration.RegistrationManagementAPI.models.User;
import com.registration.RegistrationManagementAPI.services.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import java.util.HashMap;
import java.util.Map;
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @PostMapping("/users")
    public ResponseEntity<?> createUser(@RequestBody @Valid User user, BindingResult bindingResult) {
        if (bindingResult.hasErrors()) {
            Map<String, String> errors = new HashMap<>();
            bindingResult.getFieldErrors().forEach(error ->
                errors.put(error.getField(), error.getDefaultMessage())
            );
            return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
        }
        userService.addUser(user);
        return new ResponseEntity<>("User Created Successfully", HttpStatus.OK);
    }
}

স্প্রিং বুটে গ্লোবাল এক্সেপশন হ্যান্ডলার ব্যবহার করা

এই সমাধানটি বিশ্বব্যাপী বৈধতা ত্রুটিগুলি ধরতে এবং কাস্টমাইজ করার জন্য একটি গ্লোবাল এক্সেপশন হ্যান্ডলার ব্যবহার করে, যা একটি পরিষ্কার পদ্ধতি প্রদান করে।

package com.registration.RegistrationManagementAPI.exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationErrors(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getAllErrors().forEach((error) -> {
            String fieldName = ((FieldError) error).getField();
            String errorMessage = error.getDefaultMessage();
            errors.put(fieldName, errorMessage);
        });
        return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
    }
}

স্প্রিং বুট অ্যাপ্লিকেশনগুলিতে বৈধতা এবং ত্রুটি পরিচালনার উন্নতি করা

একটি স্প্রিং বুট অ্যাপ্লিকেশন তৈরি করার সময়, সঠিক বৈধতা এবং ত্রুটি পরিচালনা নিশ্চিত করা একটি মসৃণ ব্যবহারকারীর অভিজ্ঞতার জন্য অত্যন্ত গুরুত্বপূর্ণ। একটি সাধারণ সমস্যা যা ডেভেলপাররা সম্মুখীন হয় তা হল "প্রথম নাম শূন্য হতে পারে না" এর মত বিস্তারিত যাচাইকরণ বার্তার পরিবর্তে একটি জেনেরিক "অভ্যন্তরীণ সার্ভার ত্রুটি" পাওয়া। এই সমস্যাটি প্রায়শই অ্যাপ্লিকেশানটি যাচাইকরণের ত্রুটিগুলি কীভাবে প্রক্রিয়া করে এবং প্রতিক্রিয়া পাঠায় তার কারণে হয়৷ যেমন বৈধকরণ টীকা সঠিক কনফিগারেশন @NotNul, @নটব্ল্যাঙ্ক, এবং বাইন্ডিং ফলাফল নিশ্চিত করতে পারে যে ব্যবহারকারীরা তাদের ইনপুট ত্রুটির বিষয়ে অর্থপূর্ণ প্রতিক্রিয়া পেয়েছেন।

একটি প্রায়ই উপেক্ষিত দিক হল একাধিক বৈধতা ব্যর্থতার জন্য কাস্টমাইজড ত্রুটি প্রতিক্রিয়া তৈরি করা। শুধুমাত্র প্রথম ত্রুটি ফেরত দেওয়ার পরিবর্তে, আপনি একটি মানচিত্র বা তালিকা ব্যবহার করে সমস্ত ক্ষেত্র-নির্দিষ্ট ত্রুটিগুলি ক্যাপচার করতে পারেন এবং সেগুলিকে একটি প্রতিক্রিয়াতে প্রদর্শন করতে পারেন৷ এই পদ্ধতিটি ব্যবহারকারীদের তাদের ইনপুটে সমস্ত সমস্যাগুলির একটি পরিষ্কার ওভারভিউ প্রদান করে ব্যবহারকারীদের অভিজ্ঞতাকে উন্নত করে, যাতে তারা একবারে সেগুলিকে সংশোধন করতে পারে। এই কৌশলটি অন্তর্ভুক্ত করা বিভ্রান্তি প্রতিরোধ করতে পারে এবং আপনার আবেদনের সামগ্রিক প্রবাহকে উন্নত করতে পারে।

বিবেচনা করার আরেকটি গুরুত্বপূর্ণ বিষয় হল অ্যাপ্লিকেশনের বিভিন্ন অংশে ত্রুটি বার্তা প্রেরণে ধারাবাহিকতা বজায় রাখা। একটি বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলার ব্যবহার করা নিশ্চিত করে যে সমস্ত বৈধতা ত্রুটিগুলি প্রক্রিয়া করা হয়েছে এবং একটি অভিন্ন পদ্ধতিতে ফেরত দেওয়া হয়েছে। এটি কেবল ডিবাগিংকে সহজ করে না বরং ত্রুটির প্রতিক্রিয়াগুলিকে মানসম্মত করে আরও ভাল ব্যবহারকারীর অভিজ্ঞতা প্রদান করে। এই উন্নতিগুলি "অভ্যন্তরীণ সার্ভার ত্রুটি" এর মতো অপ্রত্যাশিত আচরণগুলি হ্রাস করে এবং অ্যাপ্লিকেশনটিকে আরও অনুমানযোগ্যভাবে চালাতে সহায়তা করে।

স্প্রিং বুটে বৈধকরণ এবং ত্রুটি হ্যান্ডলিং সম্পর্কে প্রায়শই জিজ্ঞাসিত প্রশ্ন

  1. কিভাবে আমি স্প্রিং বুটে একাধিক বৈধতা ত্রুটি পরিচালনা করতে পারি?
  2. ব্যবহার করে BindingResult সমস্ত ত্রুটি ক্যাপচার করতে এবং একটি মানচিত্র বা তালিকা হিসাবে তাদের ফেরত দিতে, আপনি ব্যবহারকারীদের একবারে একাধিক বৈধতা বার্তা দেখাতে পারেন।
  3. উদ্দেশ্য কি @RestControllerAdvice?
  4. @RestControllerAdvice ত্রুটির প্রতিক্রিয়াগুলির ধারাবাহিকতা নিশ্চিত করে আপনার সম্পূর্ণ অ্যাপ্লিকেশনের জন্য বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলিং সংজ্ঞায়িত করার অনুমতি দেয়।
  5. কেন আমি বৈধতা ত্রুটির পরিবর্তে একটি "অভ্যন্তরীণ সার্ভার ত্রুটি" পেতে পারি?
  6. এটি ঘটে যখন নিয়ামকটিতে বৈধতা ত্রুটিগুলি সঠিকভাবে পরিচালনা করা হয় না। ব্যবহার করে BindingResult অথবা একটি বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলার এই সমস্যাটি সমাধান করতে পারে।
  7. কি করে @Valid স্প্রিং বুটে করবেন?
  8. @Valid নিয়ামক দ্বারা ডেটা প্রক্রিয়া করার আগে টীকা অনুরোধের অংশে বৈধতা ট্রিগার করে। এটা যেমন সীমাবদ্ধতা পরীক্ষা করে @NotNull বা @NotBlank.
  9. আমি কিভাবে একটি কাস্টমাইজড ত্রুটি বার্তা ফেরত দিতে পারি?
  10. আপনি কাস্টম ত্রুটি বার্তাগুলিকে আপনার বৈধতা টীকাতে সংজ্ঞায়িত করে ফেরত দিতে পারেন, যেমন @NotNull(message="Field cannot be null").

বৈধতা এবং ত্রুটি হ্যান্ডলিং সম্পর্কে মূল পদক্ষেপ

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

উপরন্তু, সঙ্গে বিশ্বব্যাপী ব্যতিক্রম হ্যান্ডলার ব্যবহার করে @RestControllerAdvice, বিকাশকারীরা অ্যাপ্লিকেশন জুড়ে ধারাবাহিকভাবে ত্রুটিগুলি পরিচালনা করতে পারে, যা আরও অনুমানযোগ্য এবং মসৃণ ব্যবহারকারীর অভিজ্ঞতার দিকে পরিচালিত করে৷ এই সমস্যাগুলির সমাধান করা শুধুমাত্র ডিবাগিংয়ে সহায়তা করে না বরং সামগ্রিক অ্যাপ্লিকেশনের স্থিতিশীলতাও বাড়ায়।

স্প্রিং বুটে ত্রুটি পরিচালনার জন্য উত্স এবং রেফারেন্স
  1. এই নিবন্ধটি স্প্রিং বুট ত্রুটি পরিচালনা এবং যাচাইকরণের সর্বোত্তম অনুশীলনগুলি ব্যবহার করে, স্প্রিং-এর অফিসিয়াল ডকুমেন্টেশন এবং উদাহরণগুলি ব্যবহার করে। আরও অন্তর্দৃষ্টি জন্য বাইন্ডিং রেজাল্ট এবং বৈধতা টীকা মত @বৈধ, অফিসিয়াল স্প্রিং ফ্রেমওয়ার্ক ডকুমেন্টেশন পড়ুন। স্প্রিং ফ্রেমওয়ার্ক: ফর্ম ইনপুট যাচাই করা
  2. ব্যবহার সম্পর্কে বিস্তারিত নির্দেশিকা জন্য @RestControllerAdvice স্প্রিং বুট অ্যাপ্লিকেশনে বিশ্বব্যাপী ব্যতিক্রমগুলি পরিচালনা করতে, এই সংস্থানটি দেখুন: Baeldung: স্প্রিং REST API-এ গ্লোবাল এরর হ্যান্ডলার
  3. জাভা এবং স্প্রিং বুটে দক্ষতার সাথে ব্যতিক্রম এবং বৈধতা ত্রুটিগুলি পরিচালনা করার অতিরিক্ত তথ্য এই গভীর টিউটোরিয়ালটিতে পাওয়া যাবে: দীনেশ কৃষ: স্প্রিং বুটে ত্রুটি হ্যান্ডলিং