Spring Boot এর সাথে Validation একটি গুরুত্বপূর্ণ বিষয়, যা ইউজার ইনপুট বা ডেটার সঠিকতা যাচাই করতে ব্যবহৃত হয়। স্প্রিং বুট অ্যাপ্লিকেশনগুলিতে Bean Validation API বা Hibernate Validator ব্যবহার করে ডেটার সঠিকতা নিশ্চিত করা যায়। স্প্রিং বুট স্বয়ংক্রিয়ভাবে Java Validation API (JSR 303/JSR 380) সাপোর্ট করে, যা ইনপুট ভ্যালিডেশন, কাস্টম ভ্যালিডেশন এবং ব্যাচ ভ্যালিডেশন করতে সহায়তা করে।
Validation কী এবং কেন গুরুত্বপূর্ণ?
ভ্যালিডেশন এমন একটি প্রক্রিয়া, যা ডেটার সঠিকতা, সম্পূর্ণতা এবং উপযুক্ততা যাচাই করে। এটি ইউজারের ইনপুট ডেটা, সিস্টেমে গ্রহনযোগ্য ডেটার বৈধতা পরীক্ষা করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, একটি ইমেইল ঠিকানা বা ফোন নম্বরের ফরম্যাট সঠিক কিনা বা একটি বয়সের মান নির্দিষ্ট পরিসরের মধ্যে আছে কিনা।
স্প্রিং বুট অ্যাপ্লিকেশনগুলিতে ভ্যালিডেশন ব্যবহার করার মাধ্যমে:
- অব্যবহারযোগ্য বা ভুল ইনপুট ডেটা এড়ানো যায়।
- ডেটা নিরাপত্তা নিশ্চিত করা হয়।
- ইউজার ফ্রেন্ডলি ত্রুটি মেসেজ প্রদান করা যায়।
Spring Boot এ Validation ব্যবহার
স্প্রিং বুটে Java Bean Validation API এবং Hibernate Validator একত্রে ব্যবহার করা হয়। Bean Validation API স্প্রিং বুটের @Valid বা @Validated অ্যানোটেশন দিয়ে পরিচালিত হয়।
প্রাথমিক কনফিগারেশন
স্প্রিং বুট প্রকল্পে Hibernate Validator ব্যবহার করতে spring-boot-starter-validation ডিপেনডেন্সি অন্তর্ভুক্ত করতে হয়।
Maven ডিপেনডেন্সি:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
Gradle ডিপেনডেন্সি:
implementation 'org.springframework.boot:spring-boot-starter-validation'
Validation Annotations
স্প্রিং বুট এবং Hibernate Validator ব্যবহার করে বিভিন্ন validation annotations ব্যবহার করা যেতে পারে। এগুলি Java Bean Validation API এর অংশ এবং সাধারণত ফিল্ড বা প্রোপার্টির উপরে ব্যবহার করা হয়।
সাধারণ Validation Annotations:
- @NotNull: ফিল্ডটি শূন্য (null) হতে পারবে না।
- @NotEmpty: ফিল্ডটি শূন্য বা খালি হতে পারবে না (স্ট্রিং, কালেকশন প্রকারের জন্য)।
- @NotBlank: স্ট্রিং ফিল্ডের জন্য, এটি শূন্য বা শুধু স্পেস হতে পারবে না।
- @Size(min, max): ফিল্ডের দৈর্ঘ্য বা আকার নির্ধারণ করে।
- @Email: ইমেইল ঠিকানা যাচাই করে।
- @Pattern: একটি নির্দিষ্ট রেগুলার এক্সপ্রেশন অনুসারে ইনপুট যাচাই করে।
- @Min, @Max: সংখ্যা যাচাই করতে ব্যবহৃত হয়, যেমন কোনো সংখ্যা একটি নির্দিষ্ট পরিসরের মধ্যে আছে কিনা।
- @Future, @Past: তারিখ এবং সময় যাচাই করার জন্য ব্যবহৃত হয়।
উদাহরণ: Spring Boot Validation
এখন, আমরা একটি Employee ক্লাস তৈরি করব এবং সেখানে কিছু ভ্যালিডেশন প্রয়োগ করব।
Employee ক্লাস:
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
public class Employee {
@NotNull(message = "ID must not be null")
private Long id;
@NotBlank(message = "Name is mandatory")
private String name;
@Min(value = 18, message = "Age must be at least 18")
private int age;
@Email(message = "Email should be valid")
private String email;
// Getters and Setters
}
এখানে:
@NotNullব্যবহার করা হয়েছেidফিল্ডের জন্য।@NotBlankব্যবহার করা হয়েছেnameফিল্ডের জন্য।@Minব্যবহার করা হয়েছেageফিল্ডের জন্য, যাতে বয়স ১৮ এর কম না হয়।@Emailব্যবহার করা হয়েছেemailফিল্ডের জন্য যাতে এটি একটি বৈধ ইমেইল ঠিকানা হতে হবে।
Controller লেয়ার এবং Validation
স্প্রিং বুটের @Valid বা @Validated অ্যানোটেশন ব্যবহার করে ইউজার ইনপুট ভ্যালিডেশন করা হয়। এটি কন্ট্রোলারের মেথডে ব্যবহৃত হয়, যাতে ইনপুট যাচাই করা হয়।
Controller ক্লাস:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
@RestController
@RequestMapping("/employees")
public class EmployeeController {
@PostMapping
public String addEmployee(@Valid @RequestBody Employee employee) {
// ইনপুট ভ্যালিডেশন সঠিক হলে এই পদ্ধতিটি চলে আসবে
return "Employee is valid: " + employee.getName();
}
}
এখানে:
- @Valid অ্যানোটেশন দিয়ে
Employeeক্লাসের ইনপুট ভ্যালিডেশন করা হচ্ছে। - @RequestBody অ্যানোটেশন দ্বারা ইউজার থেকে পাওয়া JSON ডেটা
Employeeঅবজেক্টে ম্যাপ করা হচ্ছে।
Custom Validation
কিছু সময় আপনাকে কাস্টম ভ্যালিডেশন তৈরি করতে হতে পারে। স্প্রিং বুট আপনাকে Custom Validator তৈরি করার সুযোগ দেয়। এটি করার জন্য আপনাকে একটি কাস্টম অ্যানোটেশন এবং ভ্যালিডেটর ক্লাস তৈরি করতে হবে।
Custom Validator উদাহরণ:
Custom Annotation:
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = AgeValidator.class)
@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidAge {
String message() default "Age must be 18 or older";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
Validator ক্লাস:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class AgeValidator implements ConstraintValidator<ValidAge, Integer> {
@Override
public void initialize(ValidAge constraintAnnotation) {
// Custom initialization if necessary
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
return value != null && value >= 18;
}
}
Employee ক্লাসে Custom Validation ব্যবহার:
public class Employee {
@ValidAge
private Integer age;
// Other fields and getters/setters
}
Validation এর জন্য Error Handling
যখন কোনো ইনপুট ভুল থাকে, তখন আপনি MethodArgumentNotValidException এর মাধ্যমে কাস্টম ত্রুটি মেসেজ দেখতে পারেন। @ExceptionHandler ব্যবহার করে আপনি সেন্ট্রালাইজড ত্রুটি হ্যান্ডলিংও করতে পারেন।
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.validation.ObjectError;
import java.util.List;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleValidationExceptions(MethodArgumentNotValidException ex) {
List<ObjectError> errors = ex.getBindingResult().getAllErrors();
StringBuilder errorMessages = new StringBuilder();
for (ObjectError error : errors) {
errorMessages.append(error.getDefaultMessage()).append("\n");
}
return errorMessages.toString();
}
}
এখানে:
MethodArgumentNotValidExceptionএক্সেপশন হ্যান্ডলিং করা হয়েছে এবং ত্রুটি মেসেজগুলি কনসোল বা ইউজারকে প্রদর্শন করার জন্য আউটপুট হিসেবে ফেরত দেওয়া হয়েছে।
সারসংক্ষেপ
স্প্রিং বুটের সাথে Validation ব্যবহারের মাধ্যমে আপনি ইউজারের ইনপুট ডেটার সঠিকতা যাচাই করতে পারেন। আপনি Java Bean Validation API এবং Hibernate Validator ব্যবহার করে স্প্রিং বুট অ্যাপ্লিকেশনে সহজেই ইনপুট ভ্যালিডেশন করতে পারেন। স্প্রিং বুটের @Valid, @NotNull, @Email, @Size এর মতো অ্যানোটেশন দিয়ে ডেটার সঠিকতা নিশ্চিত করা হয়, এবং কাস্টম ভ্যালিডেশন এবং ত্রুটি হ্যান্ডলিংও খুব সহজভাবে সম্পাদন করা যায়।
Input Validation একটি গুরুত্বপূর্ণ প্রক্রিয়া, যা অ্যাপ্লিকেশনের নিরাপত্তা এবং কার্যকারিতা নিশ্চিত করতে সহায়তা করে। যখন ব্যবহারকারী বা কোনো সিস্টেম ইনপুট প্রদান করে, তখন ইনপুটটি সঠিক, নিরাপদ এবং প্রত্যাশিত ফরম্যাটে রয়েছে কিনা তা যাচাই করা প্রয়োজন। Spring Boot অ্যাপ্লিকেশনগুলিতে ইনপুট ভ্যালিডেশন খুবই গুরুত্বপূর্ণ, কারণ এটি সিস্টেমের নিরাপত্তা, পারফরম্যান্স, এবং ডেটা সংরক্ষণের সঠিকতা নিশ্চিত করতে সহায়তা করে।
Spring Boot তে Input Validation এর প্রয়োজনীয়তা
১. ডেটার নির্ভুলতা এবং সঠিকতা নিশ্চিত করা
যখন ব্যবহারকারী ফর্মের মাধ্যমে ইনপুট প্রদান করে, তখন ইনপুট ভ্যালিডেশন এটি নিশ্চিত করে যে ইনপুটটি সঠিক টাইপ এবং ফরম্যাটে রয়েছে। উদাহরণস্বরূপ, ইমেইল ঠিকমতো ফরম্যাটে রয়েছে কিনা বা বয়সের ইনপুট একটি পজিটিভ ইন্টিজার কিনা তা যাচাই করা।
উদাহরণ: যদি ব্যবহারকারী তার বয়স ১৫০ দিন, তাহলে সিস্টেমে এটা গ্রহণযোগ্য হবে না। এই ধরণের ইনপুট ভ্যালিডেশনের মাধ্যমে সঠিক ডেটা নিশ্চিত করা যায়।
২. অ্যাপ্লিকেশনের নিরাপত্তা নিশ্চিত করা
অনেক সময় ম্যালিসিয়াস (malicious) ইনপুটের মাধ্যমে সিস্টেমে আক্রমণ করা হতে পারে (যেমন, SQL Injection)। ইনপুট ভ্যালিডেশন এই ধরনের আক্রমণ প্রতিরোধে সহায়তা করে। উদাহরণস্বরূপ, ইনপুট ফিল্ডগুলো থেকে অপ্রয়োজনীয় স্পেশাল ক্যারেক্টার (যেমন ;, ', ", --) সরিয়ে ফেলা, SQL Injection আক্রমণ প্রতিরোধ করতে সাহায্য করে।
৩. ব্যবহারকারীর অভিজ্ঞতা উন্নত করা
ভাল ইনপুট ভ্যালিডেশন ব্যবহারকারীদের দ্রুত জানাতে সাহায্য করে যদি তারা ভুল ইনপুট প্রদান করে থাকে। এতে ব্যবহারকারীরা তাদের ভুল সঠিক করতে পারেন এবং দ্রুত ফলাফল পান।
৪. ডেটাবেসের অখণ্ডতা (Integrity) নিশ্চিত করা
যদি ব্যবহারকারীর ইনপুট সঠিক না হয়, তাহলে ভুল ডেটা ডেটাবেসে সংরক্ষিত হবে, যা অ্যাপ্লিকেশনের অন্যান্য অংশে সমস্যা তৈরি করতে পারে। ইনপুট ভ্যালিডেশন ডেটাবেসের অখণ্ডতা বজায় রাখে এবং ডেটাবেসে সঠিক এবং নির্ভরযোগ্য ডেটা নিশ্চিত করে।
৫. ডেটার গুণগত মান নিশ্চিত করা
বিশেষত, যখন ডেটা বিভিন্ন উৎস (ব্যবহারকারী, সিস্টেম) থেকে আসে, তখন সঠিক ইনপুট ভ্যালিডেশন ডেটার গুণগত মান বজায় রাখতে সহায়তা করে। উদাহরণস্বরূপ, মূল্য, পরিমাণ, তারিখ, নাম এবং অন্যান্য ইনপুটের জন্য সঠিক সীমা নির্ধারণ করা হয়।
Spring Boot তে Input Validation এর জন্য ব্যবহারযোগ্য টুলস
Spring Boot অ্যাপ্লিকেশনগুলোতে ইনপুট ভ্যালিডেশন করার জন্য বেশ কিছু শক্তিশালী টুলস এবং লাইব্রেরি রয়েছে। এর মধ্যে সবচেয়ে জনপ্রিয় হল Java Bean Validation API এবং Hibernate Validator।
১. Java Bean Validation API (JSR 303/JSR 380)
Spring Boot তে Java Bean Validation API ব্যবহার করা হয় ইনপুট ভ্যালিডেশন করার জন্য। এই API বেশ কিছু বিল্ট-ইন এনোটেশন প্রদান করে, যেগুলি ক্লাসের ফিল্ডে ব্যবহার করা যায় এবং ইনপুট ভ্যালিডেশনের জন্য প্রক্রিয়া চালায়।
২. Hibernate Validator
Hibernate Validator হল Java Bean Validation API এর একটি বাস্তবায়ন। এটি Spring Boot অ্যাপ্লিকেশনগুলিতে ডিফল্ট ভ্যালিডেটর হিসেবে ব্যবহৃত হয়।
Spring Boot তে Input Validation কিভাবে কাজ করে?
Spring Boot তে ইনপুট ভ্যালিডেশন করার জন্য @Valid বা @Validated এনোটেশন ব্যবহার করা হয়। এতে ইনপুটের সমস্ত ভ্যালিডেশন কাজ করবে এবং ইনপুট যদি সঠিক না হয়, তবে MethodArgumentNotValidException ছুড়ে দেওয়া হয়। এছাড়া, @NotNull, @Size, @Email, @Min, @Max ইত্যাদি বিভিন্ন বিল্ট-ইন এনোটেশনও ব্যবহার করা হয়।
১. Entity Class এ Validation এনোটেশন ব্যবহার
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
public class User {
@NotEmpty(message = "Name should not be empty")
private String name;
@Email(message = "Invalid email address")
private String email;
@Min(value = 18, message = "Age should be greater than or equal to 18")
private int age;
// Getters and Setters
}
এখানে:
@NotEmptyনিশ্চিত করে যে নাম ফিল্ডটি খালি নয়।@Emailইমেইল ঠিকমতো ফরম্যাটে রয়েছে কিনা যাচাই করে।@Min(18)নিশ্চিত করে যে বয়স ১৮ এর বেশি।
২. Controller Class এ Validation চালানো
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping("/create")
public String createUser(@RequestBody @Valid User user) {
// যদি ইনপুট ভ্যালিড না হয়, Spring Boot স্বয়ংক্রিয়ভাবে error ফেরত দেবে
return "User created successfully";
}
}
এখানে @Valid এনোটেশন ব্যবহার করে User ইনপুট ভ্যালিডেট করা হয়েছে। ইনপুট যদি সঠিক না হয়, Spring Boot স্বয়ংক্রিয়ভাবে 400 Bad Request এর সাথে ভুলের বিস্তারিত বার্তা প্রদান করবে।
৩. Error Handling
Spring Boot তে ইনপুট ভ্যালিডেশনের ত্রুটি হ্যান্ডল করার জন্য @ExceptionHandler ব্যবহার করা যায়।
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleValidationExceptions(MethodArgumentNotValidException ex) {
BindingResult result = ex.getBindingResult();
StringBuilder sb = new StringBuilder();
for (ObjectError error : result.getAllErrors()) {
sb.append(error.getDefaultMessage()).append("\n");
}
return sb.toString();
}
}
এখানে:
@ExceptionHandler(MethodArgumentNotValidException.class)ব্যবহার করে ভ্যালিডেশন এরর হ্যান্ডল করা হয়েছে।BindingResultএর মাধ্যমে ত্রুটির বার্তা পাওয়া যায় এবং তা ব্যবহারকারীকে দেখানো হয়।
সারাংশ
Input Validation Spring Boot অ্যাপ্লিকেশনগুলির জন্য অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি নিরাপত্তা, ডেটার সঠিকতা এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত করতে সহায়তা করে। Spring Boot তে Java Bean Validation API এবং Hibernate Validator ব্যবহার করে সহজেই ইনপুট ভ্যালিডেশন করা যায়। এই ইনপুট ভ্যালিডেশন ডেটাবেসে ভুল বা অপ্রত্যাশিত ডেটা সংরক্ষণের ঝুঁকি কমায় এবং অ্যাপ্লিকেশনটির কার্যকারিতা নিশ্চিত করে।
স্প্রিং বুট অ্যাপ্লিকেশনগুলিতে ইনপুট ভ্যালিডেশন অত্যন্ত গুরুত্বপূর্ণ একটি দিক। ডাটা ভ্যালিডেশন নিশ্চিত করতে JSR-303/JSR-380 স্পেসিফিকেশন ব্যবহার করা হয়, যা Hibernate Validator এর মাধ্যমে স্প্রিং বুটে ইমপ্লিমেন্ট করা হয়। @Valid এবং @Validated অ্যানোটেশন দুটি মূলত ডাটা ভ্যালিডেশন কার্যক্রম সম্পাদন করতে ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে। এই অ্যানোটেশন দুটি মূলত কন্ট্রোলার, সার্ভিস এবং ডোমেইন মডেল ক্লাসে ব্যবহার করা হয়।
@Valid অ্যানোটেশন
@Valid অ্যানোটেশনটি JSR-303 এর অংশ হিসেবে ব্যবহার করা হয় এবং এটি ভ্যালিডেশন সম্পাদন করতে ব্যবহৃত হয়। এটি মূলত Hibernate Validator ইন্টারফেসের মাধ্যমে ক্লাস বা ফিল্ডের ভ্যালিডেশন নিশ্চিত করে। @Valid সাধারণত ফর্ম ডাটা, API রিকোয়েস্ট বডি, অথবা কোনো ডোমেইন অবজেক্টে প্রয়োগ করা হয়।
ব্যবহারের স্থান
- @Valid সাধারণত ফিল্ড ভ্যালিডেশন এবং অবজেক্ট লেভেলে ব্যবহৃত হয়।
উদাহরণ:
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.Valid;
public class User {
@NotNull
private String username;
@Size(min = 6, max = 20)
private String password;
@Valid
private Address address;
// getters and setters
}
class Address {
@NotNull
private String street;
@NotNull
private String city;
// getters and setters
}
এখানে, User ক্লাসে @Valid অ্যানোটেশন ব্যবহার করা হয়েছে, যার মাধ্যমে Address ক্লাসের ভ্যালিডেশন কার্যকর হবে। যখন User অবজেক্টটি @Valid দিয়ে ভ্যালিডেট করা হয়, তখন তার অভ্যন্তরে থাকা Address অবজেক্টও ভ্যালিডেট হবে।
কন্ট্রোলার লেভেলে উদাহরণ:
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/create")
public String createUser(@RequestBody @Valid User user) {
// user object is validated
return "User created successfully!";
}
}
এখানে, @RequestBody এর সাথে @Valid অ্যানোটেশন ব্যবহার করা হয়েছে, যাতে ইনকামিং JSON ডেটা অবজেক্টে রূপান্তর করার সময় User এবং তার অভ্যন্তরীণ Address অবজেক্ট ভ্যালিডেট করা হয়।
@Validated অ্যানোটেশন
@Validated অ্যানোটেশনটি Spring-specific এবং @Valid এর মতোই ভ্যালিডেশন কাজ করে, তবে এতে কিছু অতিরিক্ত সুবিধা রয়েছে। এটি গ্রুপ ভিত্তিক ভ্যালিডেশন (group validation) সমর্থন করে, যা @Valid এর মাধ্যমে সম্ভব নয়। এর মাধ্যমে আপনি নির্দিষ্ট গ্রুপ অনুযায়ী ভ্যালিডেশন নির্ধারণ করতে পারেন।
ব্যবহারের স্থান
- @Validated অ্যানোটেশনটি স্প্রিং কনট্রোলার বা সার্ভিস লেয়ার তে ব্যবহার করা হয়, যেখানে ভ্যালিডেশন গ্রুপের প্রয়োজন হতে পারে।
উদাহরণ:
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.springframework.validation.annotation.Validated;
import javax.validation.groups.Default;
public class User {
@NotNull(groups = {Default.class, CreateGroup.class})
private String username;
@Size(min = 6, max = 20, groups = CreateGroup.class)
private String password;
// getters and setters
}
interface CreateGroup {}
এখানে, @Validated এবং গ্রুপ ব্যবহার করা হয়েছে। CreateGroup গ্রুপের জন্য শুধুমাত্র password ভ্যালিডেশন কার্যকর হবে, তবে username গ্রুপের জন্য উভয় গ্রুপে কার্যকর থাকবে।
কন্ট্রোলার লেভেলে উদাহরণ:
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
@RestController
@RequestMapping("/user")
public class UserController {
@PostMapping("/create")
public String createUser(@RequestBody @Validated(CreateGroup.class) User user) {
// user object is validated according to the CreateGroup
return "User created successfully!";
}
}
এখানে @Validated(CreateGroup.class) ব্যবহার করা হয়েছে, যার মাধ্যমে শুধুমাত্র CreateGroup গ্রুপের জন্য নির্ধারিত ভ্যালিডেশন কার্যকর হবে। অন্য কোনো গ্রুপের জন্য ভ্যালিডেশন কার্যকর হবে না।
@Valid এবং @Validated এর পার্থক্য
| বৈশিষ্ট্য | @Valid | @Validated |
|---|---|---|
| গ্রুপ ভিত্তিক ভ্যালিডেশন | সমর্থন করে না | গ্রুপ ভিত্তিক ভ্যালিডেশন সমর্থন করে |
| অব্যবহৃত | শুধুমাত্র ফিল্ড/অবজেক্ট ভ্যালিডেশন | গ্রুপ ভিত্তিক ভ্যালিডেশন এবং স্প্রিং কনট্রোলারে ব্যবহৃত হয় |
| অ্যাপ্লিকেশন | সাধারণত Hibernate Validator এর সাথে ব্যবহৃত | স্প্রিং কনট্রোলার বা সার্ভিস লেয়ারে ব্যবহৃত |
সারাংশ
@Valid এবং @Validated দুটি অ্যানোটেশনই স্প্রিং বুটে ভ্যালিডেশন নিশ্চিত করার জন্য ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে। @Valid সাধারণত সাধারণ ফিল্ড বা অবজেক্ট ভ্যালিডেশনের জন্য ব্যবহৃত হয়, যেখানে @Validated স্প্রিং কনট্রোলার এবং সার্ভিস লেয়ারে গ্রুপ ভিত্তিক ভ্যালিডেশন সমর্থন করে। এই দুটি অ্যানোটেশন সঠিক ইনপুট ডেটা নিশ্চিত করতে সাহায্য করে এবং অ্যাপ্লিকেশনের নিরাপত্তা এবং নির্ভরযোগ্যতা বৃদ্ধি করে।
স্প্রিং বুট (Spring Boot) একটি শক্তিশালী ফ্রেমওয়ার্ক যা সাধারণত ডেটা ভ্যালিডেশন পরিচালনা করতে javax.validation এবং স্প্রিং @Valid অ্যানোটেশন ব্যবহার করে। তবে, কখনও কখনও আপনি ডিফল্ট ভ্যালিডেশন অ্যানোটেশন দ্বারা কাভার করা কিছু কাস্টম ভ্যালিডেশন লজিক প্রয়োগ করতে চান। এ ধরনের ক্ষেত্রে স্প্রিং বুটে কাস্টম ভ্যালিডেশন লজিক তৈরি করা সম্ভব। এখানে আমরা কিভাবে কাস্টম ভ্যালিডেশন লজিক তৈরি করা যায় এবং কীভাবে তা স্প্রিং বুট অ্যাপ্লিকেশনে প্রয়োগ করা যায় তা দেখব।
কাস্টম ভ্যালিডেশন লজিক তৈরি করার জন্য স্টেপস
- কাস্টম ভ্যালিডেটর তৈরি করা
- ভ্যালিডেটর ক্লাসে কাস্টম লজিক প্রয়োগ করা
- ডোমেইন অবজেক্টে কাস্টম ভ্যালিডেটর অ্যাপ্লাই করা
- কন্ট্রোলার বা সার্ভিসে @Valid বা @Validated ব্যবহার করা
১. কাস্টম ভ্যালিডেটর তৈরি করা
প্রথমে আপনাকে একটি কাস্টম ভ্যালিডেটর তৈরি করতে হবে। এটি একটি ক্লাস হবে যা ConstraintValidator ইন্টারফেসটি ইমপ্লিমেন্ট করবে এবং ভ্যালিডেশন লজিক লিখবে।
উদাহরণ:
ধরা যাক, আপনি এমন একটি ভ্যালিডেটর তৈরি করতে চান যা একটি String ফিল্ডের জন্য চেক করবে, যে ফিল্ডটি শুধুমাত্র নির্দিষ্ট একটি প্যাটার্ন মেনে চলবে (যেমন একটি ইউজারনেম যার মধ্যে কেবলমাত্র অক্ষর এবং সংখ্যা থাকবে এবং এটি 6 থেকে 15 অক্ষর হতে হবে)।
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class UsernameValidator implements ConstraintValidator<ValidUsername, String> {
@Override
public void initialize(ValidUsername constraintAnnotation) {
// Initialization logic if needed
}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
// চেক করা হচ্ছে যে ভ্যালুটি 6 থেকে 15 অক্ষরের মধ্যে এবং শুধুমাত্র অক্ষর ও সংখ্যা রয়েছে
if (value == null) {
return false; // নাল ভ্যালু কেবল অনুমোদিত নয়
}
return value.matches("^[a-zA-Z0-9]{6,15}$");
}
}
২. কাস্টম কনস্ট্রেইন্ট তৈরি করা
এবার, আমরা @ValidUsername নামক একটি কাস্টম অ্যানোটেশন তৈরি করব যা আমাদের তৈরি করা UsernameValidator ক্লাসের সাথে যুক্ত হবে।
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Constraint(validatedBy = UsernameValidator.class)
@Target({ ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidUsername {
String message() default "Invalid username. It must be between 6 to 15 characters and contain only letters and digits.";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
এখানে @Constraint(validatedBy = UsernameValidator.class) দ্বারা @ValidUsername অ্যানোটেশনটি UsernameValidator ভ্যালিডেটর ক্লাসের সাথে যুক্ত হয়েছে।
৩. ডোমেইন অবজেক্টে কাস্টম ভ্যালিডেটর অ্যাপ্লাই করা
এবার, আমরা আমাদের ডোমেইন ক্লাসে এই কাস্টম ভ্যালিডেটর ব্যবহার করব। ধরুন, আমাদের একটি User ক্লাস রয়েছে, যেখানে ইউজারনেমের জন্য আমাদের কাস্টম ভ্যালিডেশন প্রয়োগ করতে হবে।
import javax.validation.constraints.NotNull;
public class User {
@NotNull
private Long id;
@ValidUsername
private String username;
// Getters and Setters
}
এখানে User ক্লাসে username ফিল্ডের জন্য @ValidUsername অ্যানোটেশনটি প্রয়োগ করা হয়েছে।
৪. কন্ট্রোলার বা সার্ভিসে @Valid বা @Validated ব্যবহার করা
এখন, আপনাকে কন্ট্রোলার বা সার্ভিস লেয়ারে এই কাস্টম ভ্যালিডেশন লজিক কার্যকর করতে হবে। এটি করতে @Valid বা @Validated অ্যানোটেশন ব্যবহার করতে হবে।
উদাহরণ:
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
@RestController
public class UserController {
@PostMapping("/users")
public String createUser(@Valid @RequestBody User user) {
// যদি ইউজারনেম ভ্যালিড না হয়, স্প্রিং স্বয়ংক্রিয়ভাবে 400 Bad Request রিটার্ন করবে
return "User created successfully!";
}
}
এখানে, @Valid অ্যানোটেশন ব্যবহার করা হয়েছে যাতে User অবজেক্টের উপর কাস্টম ভ্যালিডেশন প্রয়োগ হয়। যদি ইউজারনেমটি সঠিক না হয়, তাহলে স্প্রিং বুট 400 (Bad Request) রেসপন্স রিটার্ন করবে এবং আপনার কাস্টম মেসেজ প্রদর্শন হবে।
কাস্টম ভ্যালিডেশন মেসেজ কাস্টমাইজ করা
আপনি যদি কাস্টম ভ্যালিডেশন মেসেজ কাস্টমাইজ করতে চান, তবে message ফিল্ড ব্যবহার করে তা করতে পারেন। এই মেসেজটি স্প্রিং বুট এপ্লিকেশন ব্যাকএন্ডে ৪০০ রেসপন্স কোড সহ ফিরে আসবে।
public @interface ValidUsername {
String message() default "Invalid username. It must be between 6 to 15 characters and contain only letters and digits.";
...
}
সারাংশ
স্প্রিং বুটে কাস্টম ভ্যালিডেশন লজিক তৈরি করা খুবই সহজ এবং নমনীয়। আপনি কাস্টম ভ্যালিডেটর ক্লাস তৈরি করে আপনার নিজের কাস্টম ভ্যালিডেশন লজিক প্রয়োগ করতে পারেন। এরপর এই কাস্টম ভ্যালিডেটর অ্যাপ্লিকেশনের ডোমেইন অবজেক্টে ব্যবহার করা হয় এবং স্প্রিং বুট এটিকে হ্যান্ডেল করে। এর মাধ্যমে আপনি অ্যাপ্লিকেশনের ডেটা ভ্যালিডেশন আরো শক্তিশালী এবং নির্দিষ্টভাবে কাস্টমাইজ করতে পারেন।
স্প্রিং বুট অ্যাপ্লিকেশনে ভ্যালিডেশন অত্যন্ত গুরুত্বপূর্ণ, যা ব্যবহারকারীর ইনপুট সঠিকভাবে যাচাই করার জন্য ব্যবহৃত হয়। স্প্রিং বুটে ভ্যালিডেশন সাধারণত Javax Validation API বা Hibernate Validator ব্যবহার করে সম্পন্ন হয়। এটি ডেটা ভ্যালিডেশন এবং কাস্টম ভ্যালিডেশন ফিচার সরবরাহ করে।
স্প্রিং বুটের মধ্যে, আমরা @Valid এবং @NotNull, @Size, @Email ইত্যাদি অ্যানোটেশন ব্যবহার করে ভ্যালিডেশন ইমপ্লিমেন্ট করতে পারি।
এখানে একটি সাধারণ উদাহরণ দিয়ে স্প্রিং বুট অ্যাপ্লিকেশনে ভ্যালিডেশন কিভাবে কাজ করে তা ব্যাখ্যা করা হলো।
১. ভ্যালিডেশন ডিপেনডেন্সি যোগ করা
স্প্রিং বুট অ্যাপ্লিকেশনে ভ্যালিডেশন ব্যবহারের জন্য প্রথমে spring-boot-starter-validation ডিপেনডেন্সি pom.xml ফাইলে যোগ করতে হয়।
<dependencies>
<!-- Spring Boot Starter Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter Validation -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
এটি Hibernate Validator ফ্রেমওয়ার্কের মাধ্যমে ডেটা ভ্যালিডেশন ফিচার সরবরাহ করে।
২. ভ্যালিডেশন অ্যানোটেশন ব্যবহার
স্প্রিং বুট অ্যাপ্লিকেশনে ভ্যালিডেশন অ্যানোটেশনগুলো বিভিন্ন ধরনের ইনপুট ভ্যালিডেশন করার জন্য ব্যবহৃত হয়। যেমন:
- @NotNull: ভ্যালু নাল হতে পারবে না।
- @Size: স্ট্রিং বা কলোপ্প ফিল্ডের আকার নির্ধারণ করে।
- @Email: একটি বৈধ ইমেইল ফরম্যাটের জন্য।
- @Min, @Max: সংখ্যার জন্য মিনিমাম এবং ম্যাক্সিমাম সীমা।
- @Pattern: প্যাটার্ন মিলিয়ে ইনপুট যাচাই।
৩. ভ্যালিডেশন উদাহরণ
আমরা একটি User ক্লাস তৈরি করব, যাতে ব্যবহারকারীর ইনপুট যাচাই করা হবে।
User DTO ক্লাস তৈরি করা
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class UserDTO {
@NotNull(message = "Name cannot be null")
@Size(min = 3, max = 50, message = "Name should be between 3 and 50 characters")
private String name;
@Email(message = "Please provide a valid email address")
@NotNull(message = "Email cannot be null")
private String email;
@Min(value = 18, message = "Age should be at least 18")
private int age;
// Getters and Setters
}
এখানে:
@NotNull: নাম এবং ইমেইল ফিল্ডে নাল ইনপুট প্রতিরোধ করছে।@Size: নামের জন্য মাপ নির্ধারণ করছে (3 থেকে 50 অক্ষরের মধ্যে হতে হবে)।@Email: ইমেইল ফিল্ডের জন্য বৈধ ইমেইল ফরম্যাট চেক করছে।@Min: বয়সের জন্য ১৮ এর নিচে প্রবেশ করা যাবে না।
Controller ক্লাস তৈরি করা
এখন আমরা একটি কন্ট্রোলার তৈরি করব, যেখানে ভ্যালিডেশন কার্যকর করা হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@RestController
@RequestMapping("/users")
public class UserController {
@PostMapping
public ResponseEntity<String> createUser(@RequestBody @Valid UserDTO userDTO, BindingResult result) {
if (result.hasErrors()) {
return ResponseEntity.badRequest().body(result.getAllErrors().toString());
}
return ResponseEntity.ok("User created successfully");
}
}
এখানে:
@Valid:UserDTOঅবজেক্টের উপর ভ্যালিডেশন প্রক্রিয়া চালাবে।BindingResult: এটি@Validঅ্যানোটেশনের ফলস্বরূপ কোন ত্রুটি (error) হয়েছে কিনা তা ধারণ করবে।result.hasErrors(): যদি কোনো ভ্যালিডেশন ত্রুটি থাকে, তবে তাbadRequestএর মাধ্যমে ক্লায়েন্টকে ফেরত দেওয়া হবে।
৪. কাস্টম ভ্যালিডেশন (Custom Validation)
আপনি যদি কোনো কাস্টম ভ্যালিডেশন তৈরি করতে চান, তবে একটি কাস্টম অ্যানোটেশন তৈরি করতে হবে। নিচে একটি কাস্টম ভ্যালিডেশন উদাহরণ দেখানো হলো:
CustomAnnotation.java
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
// Custom Annotation
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AgeValidator.class) // Specifying the Validator class
public @interface ValidAge {
String message() default "Age must be between 18 and 100";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
AgeValidator.java
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class AgeValidator implements ConstraintValidator<ValidAge, Integer> {
@Override
public void initialize(ValidAge validAge) {
}
@Override
public boolean isValid(Integer age, ConstraintValidatorContext context) {
return age >= 18 && age <= 100; // Validate age between 18 and 100
}
}
DTO ক্লাসে কাস্টম ভ্যালিডেশন ব্যবহার
public class UserDTO {
@ValidAge
private int age;
// Getters and Setters
}
এখানে @ValidAge কাস্টম অ্যানোটেশনটি ১৮ থেকে ১০০ এর মধ্যে বয়স ভ্যালিডেট করবে।
৫. টেস্টিং
স্প্রিং বুট অ্যাপ্লিকেশন টেস্ট করার সময় আপনি ভ্যালিডেশন ফলস্বরূপ কিছু ত্রুটি দেখতে পারবেন। স্প্রিং বুটের @DataJpaTest বা @SpringBootTest ব্যবহার করে আপনি ভ্যালিডেশন টেস্ট করতে পারেন।
সারাংশ
স্প্রিং বুট অ্যাপ্লিকেশনে ভ্যালিডেশন ইমপ্লিমেন্টেশন খুব সহজ। আপনি স্প্রিং বুটের Javax Validation API বা Hibernate Validator ব্যবহার করে @Valid এবং অন্যান্য ভ্যালিডেশন অ্যানোটেশন যেমন @NotNull, @Size, @Email, @Min, @Pattern ইত্যাদি ব্যবহার করে ইনপুট ভ্যালিডেশন কার্যকর করতে পারেন। আপনি চাইলে কাস্টম ভ্যালিডেশন অ্যানোটেশনও তৈরি করতে পারেন। এসব ফিচারের মাধ্যমে ইনপুট সঠিকভাবে যাচাই করা সম্ভব হয়, যা নিরাপদ এবং সঠিক ডেটা গ্রহণে সহায়ক।
Read more