Bean Validation হল Java Beans-এর প্রপার্টি বা ফিল্ডগুলির মান যাচাই করার প্রক্রিয়া। Java Beans প্রোগ্রামিংয়ে আপনি সাধারণত @Valid, @NotNull, @Size, @Min, @Max ইত্যাদি অ্যানোটেশন ব্যবহার করে Bean এর বিভিন্ন প্রপার্টির উপর ভ্যালিডেশন প্রয়োগ করতে পারেন। এটি সাধারণত ফর্ম ডেটা, ইউজার ইনপুট বা ডেটাবেস অপারেশন থেকে আসা ডেটার বৈধতা পরীক্ষা করার জন্য ব্যবহৃত হয়।
Bean Validation এ Java Validation API (JSR 303/JSR 380) ব্যবহার করা হয়, যা আপনাকে Java Bean এর ফিল্ডে স্বয়ংক্রিয়ভাবে কিছু শর্ত নির্ধারণ করে এবং সেই শর্তগুলির ভিত্তিতে ডেটার বৈধতা যাচাই করতে সহায়তা করে।
1. Bean Validation API Overview
Java Bean Validation API (JSR 303/JSR 380) আপনাকে Java Beans-এর প্রপার্টি/ফিল্ডগুলির জন্য নির্দিষ্ট কন্ডিশন চেক করার সুবিধা দেয়। এই API প্রপার্টির মান পরীক্ষা করতে annotations ব্যবহার করে। কিছু সাধারণভাবে ব্যবহৃত annotations হল:
- @NotNull: এটি যাচাই করে যে প্রপার্টির মান শূন্য (null) নয়।
- @Size: এটি যাচাই করে যে একটি String বা Collection নির্দিষ্ট আকারের মধ্যে আছে কিনা।
- @Min/@Max: এটি যাচাই করে যে সংখ্যার মান নির্দিষ্ট পরিসরের মধ্যে রয়েছে কিনা।
- @Email: এটি যাচাই করে যে একটি ইমেল ঠিক আছে কিনা।
- @Pattern: এটি একটি String এর উপর একটি নির্দিষ্ট রেগুলার এক্সপ্রেশন প্রয়োগ করে।
2. Bean Validation Setup
Java Bean Validation (JSR 303/JSR 380) ব্যবহার করতে হলে প্রথমে আপনাকে প্রয়োজনীয় ডিপেনডেন্সি যোগ করতে হবে। Bean Validation লাইব্রেরি সাধারণত Hibernate Validator-এর মাধ্যমে বাস্তবায়িত হয়।
Maven Dependency:
Maven ব্যবহার করলে আপনি pom.xml-এ এই ডিপেনডেন্সি যোগ করতে পারেন:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.0.Final</version> <!-- সর্বশেষ সংস্করণ ব্যবহার করতে পারেন -->
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>2.0.1.Final</version>
</dependency>Gradle Dependency:
Gradle ব্যবহার করলে build.gradle-এ এই ডিপেনডেন্সি যোগ করতে হবে:
dependencies {
implementation 'org.hibernate:hibernate-validator:6.2.0.Final'
implementation 'javax.validation:validation-api:2.0.1.Final'
}3. Bean Validation Example (বিন ভ্যালিডেশন উদাহরণ)
এখন আমরা একটি উদাহরণ দেখবো যেখানে Java Bean-এর ফিল্ডগুলির জন্য কিছু ভ্যালিডেশন প্রয়োগ করা হবে।
উদাহরণ:
import javax.validation.constraints.*;
public class Person {
@NotNull(message = "Name cannot be null")
@Size(min = 2, max = 50, message = "Name must be between 2 and 50 characters")
private String name;
@Min(value = 18, message = "Age must be at least 18")
@Max(value = 100, message = "Age must be less than or equal to 100")
private int age;
@Email(message = "Email should be valid")
private String email;
// Constructor, Getters and Setters
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}এখানে, Person Bean এর উপর কিছু সাধারণ ভ্যালিডেশন অ্যানোটেশন প্রয়োগ করা হয়েছে:
@NotNull—nameফিল্ড শূন্য (null) হতে পারবে না।@Size—nameফিল্ডের দৈর্ঘ্য ২ থেকে ৫০ ক্যারেক্টারের মধ্যে থাকতে হবে।@Minএবং@Max—ageফিল্ডের মান ১৮ থেকে ১০০ এর মধ্যে থাকতে হবে।@Email—emailফিল্ডটি একটি বৈধ ইমেল ঠিকানা হতে হবে।
4. Bean Validation Execution (বিন ভ্যালিডেশন প্রয়োগ)
Bean Validation প্রক্রিয়া চালানোর জন্য আপনাকে Validator অবজেক্ট তৈরি করতে হবে। এর মাধ্যমে আপনি আপনার Java Bean এর ভ্যালিডেশন পরীক্ষা করতে পারবেন। নিচে একটি উদাহরণ দেওয়া হলো যেখানে Validator ব্যবহার করে Person Bean ভ্যালিডেশন করা হচ্ছে।
Bean Validation চালানো:
import javax.validation.*;
import java.util.Set;
public class Main {
public static void main(String[] args) {
// Create a Person object with invalid data
Person person = new Person("J", 17, "invalidEmail");
// Create a ValidatorFactory and Validator
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// Validate the person object
Set<ConstraintViolation<Person>> violations = validator.validate(person);
// Check if there are any violations and print them
if (violations.isEmpty()) {
System.out.println("Person is valid.");
} else {
for (ConstraintViolation<Person> violation : violations) {
System.out.println("Validation error: " + violation.getMessage());
}
}
}
}আউটপুট:
Validation error: Name must be between 2 and 50 characters
Validation error: Age must be at least 18
Validation error: Email should be validএখানে, Person Bean-এ name, age, এবং email প্রপার্টির জন্য কিছু ভ্যালিডেশন নিয়ম দেয়া হয়েছে। যখন আমরা person অবজেক্ট ভ্যালিডেট করি, তখন এই ভ্যালিডেশন চেকগুলো প্রয়োগ হয় এবং যদি কোনো সমস্যা থাকে, তবে তা আউটপুটে দেখানো হয়।
5. Grouping Constraints (কন্সট্রেইন্ট গ্রুপিং)
Bean Validation-এ আপনি Group Constraints ব্যবহার করে কনস্ট্রেইন্ট গ্রুপিং করতে পারেন। এর মাধ্যমে, আপনি ভিন্ন ভিন্ন সময় বা প্রেক্ষিতে ভিন্ন ভিন্ন কনস্ট্রেইন্ট প্রয়োগ করতে পারেন।
উদাহরণ:
import javax.validation.constraints.*;
import javax.validation.GroupSequence;
public class Person {
public interface Basic {}
public interface Advanced {}
@NotNull(groups = Basic.class)
private String name;
@Min(value = 18, groups = Advanced.class)
private int age;
// Getters and Setters...
}এখানে, আপনি Basic এবং Advanced নামে দুটি গ্রুপ তৈরি করেছেন। name ফিল্ডটি Basic গ্রুপের জন্য প্রযোজ্য এবং age ফিল্ডটি Advanced গ্রুপের জন্য প্রযোজ্য।
Group Sequence Example:
@GroupSequence({Basic.class, Advanced.class})
public interface ValidationSequence {}এটি গ্রুপগুলোর অর্ডার ঠিক করে এবং আপনি গ্রুপগুলোর উপর ভিত্তি করে ভ্যালিডেশন প্রয়োগ করতে পারেন।
সারাংশ
- Bean Validation হল Java Beans-এর প্রপার্টি যাচাই করার প্রক্রিয়া, যা JSR 303/JSR 380 অ্যানোটেশন ব্যবহার করে করা হয়।
- @NotNull, @Size, @Min, @Max, @Email ইত্যাদি অ্যানোটেশন ব্যবহার করে প্রপার্টির বৈধতা যাচাই করা হয়।
- Validator অবজেক্ট ব্যবহার করে Bean Validation কার্যকর করা হয় এবং ConstraintViolation ক্লাসের মাধ্যমে ত্রুটিগুলি শনাক্ত করা যায়।
- Group Constraints ব্যবহার করে কনস্ট্রেইন্ট গ্রুপ তৈরি করা এবং প্রয়োগ করা যায়।
Bean Validation লাইব্রেরি Java Beans-এর ডেটার সঠিকতা নিশ্চিত করার জন্য একটি শক্তিশালী এবং কার্যকরী টুল।
Bean Validation হল একটি প্রক্রিয়া যা Java Bean-এ থাকা প্রপার্টিগুলির মান যাচাই করার জন্য ব্যবহৃত হয়। এটি সাধারণত ফর্ম ডেটা, ইউজার ইনপুট, বা অন্যান্য ডেটা যেগুলি Bean এর প্রপার্টির মাধ্যমে ম্যানেজ করা হয়, সেগুলির জন্য ব্যবহৃত হয়। Bean Validation এর মাধ্যমে নিশ্চিত করা হয় যে Bean এর প্রপার্টি গুলি সঠিক এবং প্রয়োজনীয় শর্তগুলি পূরণ করছে।
Java Bean Validation সাধারণত দুটি স্তরে কাজ করে:
- সামান্য যাচাই (Simple Validation): প্রপার্টি মানের সাধারণ বৈধতা (যেমন,
nullচেক বা মিনিমাম/ম্যাক্সিমাম ভ্যালু যাচাই করা)। - কাস্টম যাচাই (Custom Validation): যখন সাধারণ যাচাইয়ের বাইরে কিছু বিশেষ যাচাই প্রয়োজন হয়, যেমন কাস্টম ভ্যালিডেশন লজিক প্রয়োগ করা।
Java Bean Validation করতে আমরা সাধারণত Javax Validation API (JSR-303/JSR-380) ব্যবহার করি, যার মধ্যে বিভিন্ন বিল্ট-ইন কনস্ট্রেইন্ট (Constraint) এন্ড অ্যাট্রিবিউট রয়েছে, যেমন @NotNull, @Size, @Min, @Max, ইত্যাদি।
1. Java Bean Validation API
Java Bean Validation API (JSR-303) একটি নির্দিষ্ট স্পেসিফিকেশন যা Bean প্রপার্টির বৈধতা যাচাই করার জন্য ব্যবহৃত হয়। @Valid এবং বিভিন্ন কনস্ট্রেইন্ট অ্যানোটেশন ব্যবহার করে Bean এর প্রপার্টি গুলির যাচাই করা যায়।
Bean Validation এর সাধারণ ধাপ:
- অ্যানোটেশন ব্যবহার করা: Bean-এর প্রপার্টিতে কনস্ট্রেইন্ট অ্যাপ্লাই করতে আপনি বিভিন্ন অ্যানোটেশন ব্যবহার করেন (যেমন
@NotNull,@Size,@Emailইত্যাদি)। - Validator ব্যবহার করা: একটি
Validatorঅবজেক্ট ব্যবহার করে Bean বা প্রপার্টি যাচাই করা হয়। - ভ্যালিডেশন ফলাফল: যদি Bean এর প্রপার্টি কোনো কনস্ট্রেইন্ট ভঙ্গ করে, তবে এটি একটি ভ্যালিডেশন ফলাফল প্রদান করে।
2. Bean Validation উদাহরণ
উদাহরণ ১: Bean Validation এর জন্য অ্যানোটেশন ব্যবহার
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.constraints.Min;
public class Person {
@NotNull(message = "Name cannot be null")
@Size(min = 2, max = 50, message = "Name should be between 2 and 50 characters")
private String name;
@Min(value = 18, message = "Age must be at least 18")
private int age;
// Getter and Setter methods
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}ব্যাখ্যা:
- @NotNull: এটি নিশ্চিত করে যে
nameপ্রপার্টি null না হয়। - @Size: এটি নিশ্চিত করে যে
nameপ্রপার্টি ২ থেকে ৫০ ক্যারেক্টারের মধ্যে থাকবে। - @Min: এটি নিশ্চিত করে যে
ageপ্রপার্টির মান ১৮ অথবা তার বেশি হতে হবে।
উদাহরণ ২: Bean Validation ফলাফল যাচাই করা
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
import java.util.Set;
public class BeanValidationExample {
public static void main(String[] args) {
// Create a new Person object
Person person = new Person();
person.setName("J"); // Invalid name
person.setAge(17); // Invalid age
// Create a ValidatorFactory
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// Validate the person object
Set<ConstraintViolation<Person>> violations = validator.validate(person);
// Check if any violations exist
if (!violations.isEmpty()) {
// Print violation messages
for (ConstraintViolation<Person> violation : violations) {
System.out.println(violation.getMessage());
}
} else {
System.out.println("No violations, the bean is valid.");
}
}
}ব্যাখ্যা:
Validator: Bean-এর প্রপার্টি যাচাই করার জন্যValidatorঅবজেক্ট তৈরি করা হয়েছে।ConstraintViolation: ভ্যালিডেশন ফলাফল একটি সেট আকারে পাওয়া যায়, যেখানে প্রতিটি ভায়োলেশন বার্তা থাকে।
আউটপুট:
Name should be between 2 and 50 characters
Age must be at least 18এখানে, name এবং age প্রপার্টির ভ্যালিডেশন ভাঙছে, তাই দুটি ভায়োলেশন বার্তা দেখা যাবে।
3. কাস্টম Bean Validation
যদি আপনি কিছু কাস্টম ভ্যালিডেশন করতে চান, যেমন PhoneNumber ভ্যালিডেশন বা কোনো নির্দিষ্ট শর্তে প্রপার্টি যাচাই, তাহলে 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 = PhoneNumberValidator.class)
@Target({ ElementType.FIELD, ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidPhoneNumber {
String message() default "Invalid phone number";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}- Custom Validator তৈরি করা:
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class PhoneNumberValidator implements ConstraintValidator<ValidPhoneNumber, String> {
@Override
public void initialize(ValidPhoneNumber constraintAnnotation) {}
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
if (value == null) {
return true; // assuming null is valid
}
// Basic phone number validation (just an example)
return value.matches("\\d{10}");
}
}- Custom Validator ব্যবহার করা:
public class Person {
@ValidPhoneNumber
private String phoneNumber;
// Getter and Setter methods
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}ব্যাখ্যা:
- Custom Annotation:
@ValidPhoneNumberকাস্টম অ্যানোটেশনটি ব্যবহার করেPhoneNumberValidatorক্লাসে ফোন নম্বর যাচাই করা হয়েছে। - PhoneNumberValidator: এই ক্লাসে কাস্টম লজিক ব্যবহার করে ফোন নম্বর যাচাই করা হয়।
সারাংশ
- Java Bean Validation হল একটি শক্তিশালী উপায় Java Bean-এর প্রপার্টির বৈধতা যাচাই করার জন্য। এটি সাধারণত
@NotNull, @Size, @Min` এর মতো বিভিন্ন বিল্ট-ইন অ্যানোটেশন ব্যবহার করে করা হয়। - Bean Validation API (JSR 303/JSR 380) ব্যবহার করে আপনি Bean প্রপার্টির জন্য বিভিন্ন কনস্ট্রেইন্ট অ্যাপ্লাই করতে পারেন এবং
Validatorক্লাস ব্যবহার করে সেটি যাচাই করতে পারেন। - আপনি যদি কাস্টম ভ্যালিডেশন করতে চান, তবে Custom Annotations এবং Constraint Validators তৈরি করে নির্দিষ্ট শর্তে ডেটা যাচাই করা সম্ভব।
Hibernate Validator এবং Apache Commons BeanUtils এর ইন্টিগ্রেশন করতে হলে, আমরা Hibernate Validator ব্যবহার করে Java Beans-এর প্রপার্টি ভ্যালিডেশন করব এবং BeanUtils ব্যবহার করে সেই Bean-এর প্রপার্টি কপি বা ম্যানিপুলেট করব। এই ইন্টিগ্রেশন আপনাকে একটি সহজ এবং কার্যকর উপায়ে ডেটা ভ্যালিডেট ও ম্যানিপুলেট করতে সাহায্য করবে।
কাজের ধাপ
- Hibernate Validator যোগ করা: Hibernate Validator ব্যবহার করে Bean-এর প্রপার্টিগুলোর ভ্যালিডেশন করতে হবে।
- BeanUtils ব্যবহার করা: Bean-এর প্রপার্টিগুলো এক অবজেক্ট থেকে আরেকটিতে কপি বা ম্যানিপুলেট করতে হবে।
- ইন্টিগ্রেশন: Bean-এর ভ্যালিডেশন সফল হলে প্রপার্টি কপি করা হবে।
Maven ডিপেনডেন্সি
pom.xml ফাইলে Hibernate Validator এবং BeanUtils ডিপেনডেন্সি যোগ করুন।
<dependencies>
<!-- Hibernate Validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>6.2.5.Final</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>javax.el-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.el</artifactId>
<version>3.0.0</version>
</dependency>
<!-- Apache Commons BeanUtils -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.4</version>
</dependency>
</dependencies>উদাহরণ: Hibernate Validator এবং BeanUtils ইন্টিগ্রেশন
1. Bean তৈরি করা
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class Person {
@NotNull(message = "Name cannot be null")
@Size(min = 2, max = 50, message = "Name must be between 2 and 50 characters")
private String name;
@NotNull(message = "Age cannot be null")
private Integer age;
public Person() {}
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}2. ভ্যালিডেশন এবং প্রপার্টি কপি করা
import org.apache.commons.beanutils.BeanUtils;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;
import java.util.Set;
public class HibernateValidatorBeanUtilsExample {
public static void main(String[] args) {
try {
// Source Bean
Person sourcePerson = new Person("John Doe", 25);
// Validate the source object
if (validateBean(sourcePerson)) {
// Target Bean
Person targetPerson = new Person();
// Copy properties from source to target
BeanUtils.copyProperties(targetPerson, sourcePerson);
// Output copied properties
System.out.println("Target Name: " + targetPerson.getName());
System.out.println("Target Age: " + targetPerson.getAge());
}
} catch (Exception e) {
e.printStackTrace();
}
}
// Bean validation method
private static boolean validateBean(Object bean) {
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// Validate the bean
Set<ConstraintViolation<Object>> violations = validator.validate(bean);
// Check for validation errors
if (!violations.isEmpty()) {
for (ConstraintViolation<Object> violation : violations) {
System.out.println("Validation Error: " + violation.getMessage());
}
return false;
}
return true;
}
}কোডের ব্যাখ্যা
- Bean validation:
validateBean()মেথড Hibernate Validator ব্যবহার করে Bean-এর সমস্ত প্রপার্টি ভ্যালিডেট করে।- যদি কোনো ভ্যালিডেশন এরর থাকে, তবে সেগুলো কনসোল আউটপুটে দেখানো হয়।
- Property Copy:
- যদি ভ্যালিডেশন সফল হয়, তবে
BeanUtils.copyProperties()মেথড ব্যবহার করেsourcePersonথেকেtargetPerson-এ প্রপার্টিগুলো কপি করা হয়।
- যদি ভ্যালিডেশন সফল হয়, তবে
- আউটপুট:
- Target Bean-এর প্রপার্টিগুলো
sourcePersonথেকে কপি করার পর কনসোল আউটপুটে প্রদর্শিত হয়।
- Target Bean-এর প্রপার্টিগুলো
উদাহরণ আউটপুট
১. সফল ভ্যালিডেশন:
Target Name: John Doe
Target Age: 25২. ভ্যালিডেশন ব্যর্থ হলে:
Validation Error: Name cannot be null
Validation Error: Age cannot be nullCustom Validators এর সাথে BeanUtils ইন্টিগ্রেশন
কাস্টম ভ্যালিডেটর ব্যবহার করেও একইভাবে ইন্টিগ্রেশন করা যায়। Hibernate Validator আপনাকে Bean-এ কাস্টম ভ্যালিডেশন লজিক যোগ করতে দেয়। উদাহরণস্বরূপ:
Custom Validator উদাহরণ
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class CustomNameValidator implements ConstraintValidator<ValidName, String> {
@Override
public boolean isValid(String value, ConstraintValidatorContext context) {
return value != null && value.matches("[A-Za-z ]+");
}
}সারাংশ
- Hibernate Validator ব্যবহার করে Java Bean ভ্যালিডেট করার পরে BeanUtils এর মাধ্যমে প্রপার্টি ম্যানিপুলেশন সহজ করা যায়।
- BeanUtils এবং Hibernate Validator-এর ইন্টিগ্রেশন জটিল ডেটা ভ্যালিডেশন এবং ম্যানিপুলেশনকে কার্যকরভাবে সমাধান করে।
- কাস্টম ভ্যালিডেশন লজিক যোগ করার জন্য Hibernate Validator-এর ক্ষমতাকে কাস্টমাইজ করা সম্ভব।
Java Beans-এ Custom Validation Logic যোগ করা একটি সাধারণ এবং প্রয়োজনীয় কার্যকলাপ, বিশেষ করে যখন আপনি অবজেক্টের ডেটার সঠিকতা বা ভালোরতা যাচাই করতে চান। Java Beans এ কাস্টম ভ্যালিডেশন অ্যাড করার জন্য আপনি getter/setter মেথডে কাস্টম লজিক ব্যবহার করতে পারেন অথবা validation frameworks যেমন Hibernate Validator বা JSR-303 ব্যবহার করতে পারেন। তবে এখানে আমরা Apache Commons BeanUtils এবং সাধারণ Java কোড ব্যবহার করে কাস্টম ভ্যালিডেশন যুক্ত করার পদ্ধতি আলোচনা করব।
1. Getter/Setter মেথডে Custom Validation
একটি সাধারণ Java Bean-এ কাস্টম ভ্যালিডেশন যুক্ত করতে, আপনি setter মেথডের মধ্যে লজিক লিখে প্রপার্টির মান যাচাই করতে পারেন। যদি মানটি বৈধ না হয়, আপনি Exception অথবা Error ফেলে দিতে পারেন।
উদাহরণ: Bean-এর মধ্যে Custom Validation Logic
public class Person {
private String name;
private int age;
// Constructor, getter, and setter methods
public Person() {}
public Person(String name, int age) {
setName(name);
setAge(age);
}
public String getName() {
return name;
}
// Setter with validation logic
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be empty");
}
this.name = name;
}
public int getAge() {
return age;
}
// Setter with validation logic
public void setAge(int age) {
if (age <= 0) {
throw new IllegalArgumentException("Age must be positive and greater than zero");
}
this.age = age;
}
}ব্যাখ্যা:
setName()এবংsetAge()মেথডে কাস্টম ভ্যালিডেশন যুক্ত করা হয়েছে।setName()-এ যদি নাম null বা খালি (empty) থাকে, তাহলে একটি IllegalArgumentException ফেলা হবে।setAge()-এ যদি বয়স শূন্য বা ঋণাত্মক হয়, তাহলে একটি IllegalArgumentException ফেলা হবে।- এই ধরনের কাস্টম ভ্যালিডেশন মেথডের মাধ্যমে আপনি Bean-এ প্রপার্টি সেট করার আগে সেগুলি যাচাই করতে পারেন।
2. BeanUtils এবং Custom Validation
Apache Commons BeanUtils লাইব্রেরি ব্যবহার করে ডেটা কপি এবং টাইপ কনভার্সন করার সময় কাস্টম ভ্যালিডেশন যুক্ত করার জন্য, আপনি populate() মেথড বা copyProperties() ব্যবহার করতে পারেন এবং সেই সময় setter মেথডের মাধ্যমে ভ্যালিডেশন করতে পারেন।
উদাহরণ: BeanUtils ব্যবহার করে Custom Validation
import org.apache.commons.beanutils.BeanUtils;
public class BeanUtilsValidationExample {
public static void main(String[] args) {
try {
// Create a Map with invalid data
Map<String, String> personData = new HashMap<>();
personData.put("name", ""); // Invalid name
personData.put("age", "-5"); // Invalid age
Person person = new Person();
// Attempt to populate Person object using invalid data
try {
BeanUtils.populate(person, personData);
} catch (Exception e) {
System.out.println("Validation failed: " + e.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person {
private String name;
private int age;
// Getter and setter methods
public String getName() {
return name;
}
public void setName(String name) {
if (name == null || name.trim().isEmpty()) {
throw new IllegalArgumentException("Name cannot be empty");
}
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
if (age <= 0) {
throw new IllegalArgumentException("Age must be positive and greater than zero");
}
this.age = age;
}
}ব্যাখ্যা:
- এখানে আমরা
BeanUtils.populate()মেথড ব্যবহার করেPersonBean-এ ডেটা populate করছি। - তবে,
setName()এবংsetAge()মেথডে কাস্টম ভ্যালিডেশন লজিক রয়েছে, যা invalid data এ IllegalArgumentException ছুঁড়ে দেয়। - যদি কোন মান অপর্যাপ্ত বা ভুল থাকে, তাহলে Exception ছুঁড়ে দেয় এবং ভ্যালিডেশন ব্যর্থ হবে।
3. JSR-303 Bean Validation (Hibernate Validator)
যদি আপনি একটি আরও স্ট্যান্ডার্ড পদ্ধতি চান, তবে আপনি JSR-303 বা Hibernate Validator ব্যবহার করতে পারেন। Hibernate Validator একটি শক্তিশালী ভ্যালিডেশন ফ্রেমওয়ার্ক যা annotation-based validation প্রদান করে। এর মাধ্যমে আপনি Bean এর প্রপার্টি বা ফিল্ডের জন্য validation constraints সেট করতে পারেন।
উদাহরণ: Hibernate Validator ব্যবহার করে Custom Validation
import javax.validation.constraints.*;
import org.hibernate.validator.constraints.Length;
public class Person {
@NotEmpty(message = "Name cannot be empty")
private String name;
@Min(value = 1, message = "Age must be greater than zero")
private int age;
// Getter and setter methods
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}ব্যাখ্যা:
@NotEmptyannotation ব্যবহার করা হয়েছে name ফিল্ডের জন্য, যাতে ফিল্ডটি খালি না থাকে।@Minannotation ব্যবহার করা হয়েছে age ফিল্ডের জন্য, যাতে বয়স ১ বা তার বেশি হতে হবে।- আপনি Hibernate Validator ব্যবহার করে এই ধরনের validation ফিচার অ্যাড করতে পারেন এবং Bean Validation API ব্যবহার করে সেগুলি কার্যকর করতে পারেন।
Validation চালানো:
import javax.validation.*;
import java.util.Set;
public class ValidatorExample {
public static void main(String[] args) {
try {
Person person = new Person();
person.setName(""); // Invalid
person.setAge(-5); // Invalid
// Create a validator factory and validator
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();
// Validate the person object
Set<ConstraintViolation<Person>> violations = validator.validate(person);
for (ConstraintViolation<Person> violation : violations) {
System.out.println(violation.getMessage());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}ব্যাখ্যা:
@NotEmptyএবং@Minannotations এর মাধ্যমে Person ক্লাসের প্রপার্টি যাচাই করা হচ্ছে।- Validator API ব্যবহার করে, আপনি ConstraintViolation এর মাধ্যমে কাস্টম ভ্যালিডেশন ত্রুটি বার্তা দেখতে পারবেন।
সারাংশ
- Getter/Setter মেথডে Custom Validation: আপনি setter মেথডে কাস্টম ভ্যালিডেশন যুক্ত করতে পারেন, যেমন একটি প্রপার্টি যদি অবৈধ হয়, তাহলে Exception ছুড়ে দিন।
- BeanUtils ব্যবহার করে Validation: BeanUtils.populate() মেথড ব্যবহার করে Map থেকে Bean populate করার সময়, getter/setter মেথডের মাধ্যমে ভ্যালিডেশন লজিক কার্যকর করা সম্ভব।
- JSR-303 / Hibernate Validator: annotation-based validation ব্যবহার করে আপনি Java Beans-এ ভ্যালিডেশন যুক্ত করতে পারেন, যা একটি স্ট্যান্ডার্ড এবং শক্তিশালী পদ্ধতি।
Data Binding এবং Validation Handling হল কোনো অ্যাপ্লিকেশনে ডেটা ইন্টারঅ্যাকশন এবং কনট্রোলার ও ভিউ-এর মধ্যে তথ্য আদান-প্রদানে ব্যবহৃত গুরুত্বপূর্ণ কৌশল। ওয়েব অ্যাপ্লিকেশন এবং ডেস্কটপ অ্যাপ্লিকেশন উভয়ের জন্যই এই দুটি কৌশল অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন ফর্ম ইনপুট, ডেটাবেস থেকে ডেটা প্রাপ্তি বা অন্যান্য ইন্টারঅ্যাকশন সংক্রান্ত কাজ করতে হয়।
এই টিউটোরিয়ালে আমরা Data Binding এবং Validation Handling নিয়ে বিস্তারিত আলোচনা করব এবং কীভাবে এগুলি অ্যাপ্লিকেশনে কার্যকরভাবে ব্যবহার করা যায় তা দেখব।
১. Data Binding
Data Binding হল এমন একটি প্রক্রিয়া যা ব্যবহারকারী ইন্টারফেস (UI) এবং ডেটা মডেল (Java Bean বা DTO) এর মধ্যে সম্পর্ক তৈরি করে। Data Binding এর মাধ্যমে আপনি ভিউ এবং মডেল-এর মধ্যে ডেটা পরিবর্তন বা আপডেট করতে পারেন। দুই ধরনের Data Binding সাধারণত ব্যবহৃত হয়:
- One-way Data Binding: ডেটা শুধুমাত্র মডেল থেকে ভিউতে যায়। যেমন: UI-এ ডেটা রেন্ডার করা।
- Two-way Data Binding: ডেটা মডেল থেকে ভিউতে এবং ভিউ থেকে মডেলে যায়। যেমন: ইউজার ফর্মে ইনপুট দেওয়ার পর মডেলে সেই ডেটা আপডেট হওয়া।
উদাহরণ: One-way Data Binding (Spring Framework)
Spring MVC-এ Data Binding ফর্ম ইনপুট ডেটা মডেলে এবং ভিউয়ে (JSP/HTML) রেন্ডার করতে ব্যবহৃত হয়।
@Controller
public class UserController {
@RequestMapping("/userForm")
public String showForm(Model model) {
model.addAttribute("user", new User()); // Model object
return "userForm";
}
@RequestMapping("/submitUser")
public String submitForm(@ModelAttribute("user") User user, Model model) {
// Bind form data to model object
model.addAttribute("message", "User data submitted successfully");
return "userDetails"; // Show success page
}
}
class User {
private String name;
private String email;
// Getter and setter methods
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}userForm.jsp (HTML form)
<form:form method="POST" action="submitUser">
<form:input path="name" label="Name" />
<form:input path="email" label="Email" />
<button type="submit">Submit</button>
</form:form>ব্যাখ্যা:
@ModelAttribute("user")মাধ্যমে User Bean (Data Model) এর সাথে form data বাউন্ড করা হয়।- Data Binding এর মাধ্যমে ইনপুট ফিল্ডে ব্যবহারকারী যে ডেটা প্রদান করে, তা স্বয়ংক্রিয়ভাবে User Bean এর প্রপার্টিতে সেট হয়ে যাবে।
২. Validation Handling
Validation হল ইউজার ইনপুট যাচাই করার প্রক্রিয়া, যাতে নিশ্চিত হওয়া যায় যে ইনপুটটি সঠিক এবং প্রত্যাশিত ফরম্যাটে রয়েছে। Validation দুইভাবে করা যেতে পারে:
- Client-side Validation: JavaScript বা HTML5 attributes দ্বারা ইউজারের ইনপুট চেক করা।
- Server-side Validation: জাভা (Java) বা অন্যান্য সার্ভার সাইড প্রযুক্তি দ্বারা ইনপুট চেক করা, যা সাধারণত আরও নিরাপদ এবং নির্ভরযোগ্য।
উদাহরণ: Server-side Validation (Spring Framework)
Spring MVC-তে ইনপুট ভ্যালিডেশন করার জন্য JSR-303 Bean Validation (যেমন Hibernate Validator) ব্যবহার করা যেতে পারে।
Step 1: User Bean with Validation Annotations
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
public class User {
@NotNull(message = "Name cannot be null")
@Size(min = 2, max = 30, message = "Name should be between 2 and 30 characters")
private String name;
@NotNull(message = "Email cannot be null")
@Size(min = 5, max = 50, message = "Email should be between 5 and 50 characters")
private String email;
// Getter and setter methods
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}Step 2: Controller with Validation Logic
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.validation.Valid;
@Controller
public class UserController {
@RequestMapping("/userForm")
public String showForm(@ModelAttribute("user") User user) {
return "userForm";
}
@RequestMapping(value = "/submitUser", method = RequestMethod.POST)
public String submitForm(@Valid @ModelAttribute("user") User user, BindingResult result) {
if (result.hasErrors()) {
return "userForm"; // Return to the form with errors
}
// Process the valid user data
return "userDetails"; // Show success page
}
}Step 3: userForm.jsp (JSP page)
<form:form modelAttribute="user" method="POST" action="submitUser">
<form:input path="name" label="Name"/>
<form:errors path="name" cssClass="error" />
<form:input path="email" label="Email"/>
<form:errors path="email" cssClass="error" />
<button type="submit">Submit</button>
</form:form>ব্যাখ্যা:
@Validঅ্যানোটেশন ব্যবহার করে,UserBean-এ প্রযোজ্য validation constraints চেক করা হচ্ছে।- BindingResult ব্যবহার করে ভ্যালিডেশন এর ফলাফল চেক করা হয়। যদি ইনপুট ভ্যালিড না হয়, তবে ব্যবহারকারীকে ফর্মে ফিরে পাঠানো হয় এবং এর সাথে error message দেখানো হয়।
৩. Client-side Validation
যেহেতু client-side validation HTML5 attributes বা JavaScript দ্বারা করা হয়, এটি ইউজারকে দ্রুত ফলাফল দেখাতে সাহায্য করে, তবে এটি শুধুমাত্র সার্ভার সাইডে আবার যাচাই করা দরকার।
উদাহরণ: Client-side Validation (HTML5)
<form method="POST" action="/submitUser">
<label for="name">Name:</label>
<input type="text" id="name" name="name" required minlength="2" maxlength="30" />
<div id="nameError" style="color:red;"></div>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required minlength="5" maxlength="50" />
<div id="emailError" style="color:red;"></div>
<button type="submit">Submit</button>
</form>
<script>
document.querySelector('form').addEventListener('submit', function(event) {
var isValid = true;
var name = document.getElementById("name");
var email = document.getElementById("email");
if (name.value.length < 2 || name.value.length > 30) {
document.getElementById("nameError").textContent = "Name should be between 2 and 30 characters.";
isValid = false;
}
if (email.value.length < 5 || email.value.length > 50) {
document.getElementById("emailError").textContent = "Email should be between 5 and 50 characters.";
isValid = false;
}
if (!isValid) {
event.preventDefault();
}
});
</script>ব্যাখ্যা:
- HTML5 attributes যেমন
required,minlength,maxlengthব্যবহার করে ইনপুট ফিল্ডের প্রাথমিক ভ্যালিডেশন করা হয়েছে। - JavaScript এর মাধ্যমে আরো নির্দিষ্ট ভ্যালিডেশন (যেমন নামের দৈর্ঘ্য) করা হয়েছে, এবং ইউজার যদি ভুল ইনপুট দেয় তবে তা client-side এ ত্রুটি বার্তা দেখানো হবে।
৪. Combining Client-side and Server-side Validation
Client-side validation সাধারণত ইউজারকে দ্রুত ইনপুট যাচাই করতে সাহায্য করে, তবে Server-side validation নিরাপদ এবং নির্ভরযোগ্য, কারণ ক্লায়েন্টে ভ্যালিডেশন মেনে চলা না-ও হতে পারে। অধিকাংশ প্রকল্পে উভয় পদ্ধত
িই ব্যবহৃত হয়: ক্লায়েন্ট সাইডে দ্রুত ইনপুট চেক এবং সার্ভার সাইডে সঠিকতা নিশ্চিতকরণ।
সারাংশ
- Data Binding: এটি ভিউ এবং মডেল-এর মধ্যে ডেটার আদান-প্রদানকে সহজ করে। Spring MVC বা অন্য ফ্রেমওয়ার্কে @ModelAttribute এর মাধ্যমে ডেটা বাইন্ডিং করা হয়।
- Validation Handling: ক্লায়েন্ট সাইডে HTML5 বা JavaScript দিয়ে ভ্যালিডেশন করা হয়, এবং সার্ভার সাইডে JSR-303/JSR-380 Bean Validation API বা অন্যান্য ফ্রেমওয়ার্ক ব্যবহার করে ইনপুট যাচাই করা হয়।
- Combining Techniques: ক্লায়েন্ট সাইডে দ্রুত ইনপুট যাচাই এবং সার্ভার সাইডে নিরাপদ যাচাই সঠিকভাবে কাজ করে।
Read more