BeanUtilsBean Customization (বিনইউটিলস বিন কাস্টমাইজেশন)

জাভা বীনইউটিলস (Java BeanUtils) - Computer Programming

283

BeanUtilsBean হল Apache Commons BeanUtils লাইব্রেরির একটি গুরুত্বপূর্ণ ক্লাস যা Java Beans-এর মধ্যে ডেটা কপি, টাইপ কনভার্সন এবং প্রপার্টি ম্যানিপুলেশন পরিচালনা করতে ব্যবহৃত হয়। সাধারণত, BeanUtils.copyProperties() মেথড ব্যবহার করে প্রপার্টি কপি করা হয়, তবে BeanUtilsBean এর মাধ্যমে আপনি কাস্টম কনভার্সন, কাস্টম টাইপ কনভার্সন এবং অন্যান্য কাস্টম ম্যানিপুলেশন কার্যকরভাবে পরিচালনা করতে পারবেন।

এই ক্লাসটির মাধ্যমে আপনি BeanUtils এর ডিফল্ট আচরণ কাস্টমাইজ করতে পারেন, যেমন কাস্টম কনভার্সন লজিক যোগ করা, বিশেষ ধরনের প্রপার্টি হ্যান্ডলিং করা, এবং টাইপ কনভার্সন কাস্টমাইজ করা।


1. BeanUtilsBean কাস্টমাইজেশন:

BeanUtilsBean এর কাস্টমাইজেশনের জন্য আপনাকে প্রথমে BeanUtilsBean ক্লাসের একটি কাস্টম ইনস্ট্যান্স তৈরি করতে হবে, যেখানে আপনি কাস্টম টাইপ কনভার্সন এবং কাস্টম কনভার্সন লজিক সেট করতে পারেন।

উদাহরণ: কাস্টম কনভার্সন লজিক যোগ করা

ধরা যাক, আমাদের একটি Person ক্লাস রয়েছে, যেখানে age প্রপার্টির টাইপ String হিসেবে এসেছে এবং আমরা চাই যে BeanUtils String থেকে int টাইপে কনভার্ট করতে গিয়ে একটি কাস্টম কনভার্সন লজিক প্রয়োগ করুক।

import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.converters.AbstractConverter;
import org.apache.commons.beanutils.converters.IntegerConverter;

public class Main {
    public static void main(String[] args) throws Exception {
        // Create a custom BeanUtilsBean with a custom converter
        BeanUtilsBean beanUtilsBean = new BeanUtilsBean(new CustomConvertUtilsBean());

        // Create a Person object with String "age"
        Person person = new Person();
        person.setName("John");
        person.setAge("30");

        // Using the custom BeanUtilsBean to copy properties
        Person targetPerson = new Person();
        beanUtilsBean.getPropertyUtils().copyProperties(targetPerson, person);

        // Print the targetPerson's properties
        System.out.println("Name: " + targetPerson.getName()); // Output: John
        System.out.println("Age: " + targetPerson.getAge());  // Output: 30 (as integer)
    }
}

class Person {
    private String name;
    private String age;

    // Getter and Setter methods
    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

class CustomConvertUtilsBean extends org.apache.commons.beanutils.ConvertUtilsBean {

    // Override the getConverter method to handle custom conversions
    @Override
    public Converter lookup(Class<?> type) {
        if (type == Integer.class) {
            return new IntegerConverter();
        }
        return super.lookup(type);
    }
}

এখানে:

  • CustomConvertUtilsBean ক্লাস তৈরি করা হয়েছে যা কাস্টম কনভার্সন লজিক যোগ করেছে।
  • IntegerConverter ব্যবহার করে, String কে Integer তে কনভার্ট করা হচ্ছে।

এটি BeanUtils কনভার্সন লাইব্রেরি কাস্টমাইজ করার একটি উদাহরণ যেখানে আপনি বিশেষ ধরনের কনভার্সন হ্যান্ডলিং করতে পারেন।

আউটপুট:

Name: John
Age: 30

2. Custom Converter (কাস্টম কনভার্টার তৈরি করা)

আপনি যদি আরও কাস্টম কনভার্সন চান, তবে আপনার নিজস্ব কনভার্টার তৈরি করতে পারেন। ধরুন, আপনি একটি String প্রপার্টি যদি এমন টাইপে কনভার্ট করতে চান যা একটি বিশেষ লজিক ফলো করে, তাহলে আপনি নিজস্ব কনভার্টার তৈরি করতে পারেন।

উদাহরণ: কাস্টম কনভার্টার তৈরি করা

import org.apache.commons.beanutils.Converter;
import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.ConvertUtilsBean;

public class Main {
    public static void main(String[] args) throws Exception {
        // Register the custom converter
        BeanUtilsBean beanUtilsBean = new BeanUtilsBean(new CustomConvertUtilsBean());

        // Create a Person object
        Person person = new Person();
        person.setAge("30 years");

        // Using the custom BeanUtilsBean to copy properties
        Person targetPerson = new Person();
        beanUtilsBean.getPropertyUtils().copyProperties(targetPerson, person);

        // Print the result
        System.out.println("Age: " + targetPerson.getAge()); // Output: 30
    }
}

class Person {
    private String name;
    private String age;

    // Getter and Setter methods
    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

// Custom Converter to remove the ' years' suffix from the String
class CustomAgeConverter implements Converter {
    @Override
    public Object convert(Class type, Object value) {
        if (value instanceof String) {
            String strValue = (String) value;
            if (strValue.contains(" years")) {
                return Integer.parseInt(strValue.replace(" years", "").trim());
            }
        }
        return value;
    }
}

class CustomConvertUtilsBean extends ConvertUtilsBean {
    // Override to register the custom converter for String to Integer conversion
    @Override
    public Converter lookup(Class<?> type) {
        if (type == Integer.class) {
            return new CustomAgeConverter(); // Custom converter for age
        }
        return super.lookup(type);
    }
}

এখানে, CustomAgeConverter কাস্টম কনভার্টার তৈরি করা হয়েছে যা String-এর মধ্যে থাকা " years" অংশটি সরিয়ে ফেলবে এবং সঠিক Integer মান প্রদান করবে।

আউটপুট:

Age: 30

3. BeanUtilsBean Customization for Specific Properties

আপনি যদি নির্দিষ্ট প্রপার্টির জন্য কাস্টম কনভার্সন বা কাস্টম প্রপার্টি ম্যানিপুলেশন করতে চান, তবে BeanUtilsBean এর মধ্যে কাস্টম কনভার্সন লজিক প্রয়োগ করতে পারেন। যেমন, কিছু প্রপার্টির জন্য আপনাকে কাস্টম কনভার্সন এবং কিছু প্রপার্টির জন্য ডিফল্ট কনভার্সন রাখতে হবে।

উদাহরণ: নির্দিষ্ট প্রপার্টি কাস্টম কনভার্সন

import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.Converter;

public class Main {
    public static void main(String[] args) throws Exception {
        // Create a custom BeanUtilsBean
        BeanUtilsBean beanUtilsBean = new BeanUtilsBean(new CustomConvertUtilsBean());

        // Create a Person object
        Person person = new Person();
        person.setName("John");
        person.setAge("25");

        // Populate the target object
        Person targetPerson = new Person();
        beanUtilsBean.getPropertyUtils().copyProperties(targetPerson, person);

        // Print the result
        System.out.println("Name: " + targetPerson.getName()); // Output: John
        System.out.println("Age: " + targetPerson.getAge());   // Output: 25 (as Integer)
    }
}

class Person {
    private String name;
    private String age;

    // Getter and Setter methods
    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }
}

class CustomConvertUtilsBean extends org.apache.commons.beanutils.ConvertUtilsBean {
    @Override
    public Converter lookup(Class<?> type) {
        if (type == Integer.class) {
            return new CustomAgeConverter();  // Custom converter for Integer
        }
        return super.lookup(type);
    }
}

এখানে, নির্দিষ্ট প্রপার্টি (যেমন age) জন্য কাস্টম কনভার্সন লজিক প্রয়োগ করা হয়েছে।


সারাংশ

  • BeanUtilsBean এবং CustomConvertUtilsBean ক্লাসের মাধ্যমে আপনি Apache Commons BeanUtils এর কাস্টমাইজেশন করতে পারেন।
  • Custom Converter তৈরি করে আপনি নির্দিষ্ট প্রপার্টি বা টাইপ কনভার্সন কাস্টমাইজ করতে পারবেন।
  • BeanUtilsBean ব্যবহার করে আপনি Java Beans এর মধ্যে কাস্টম কনভার্সন লজিক, প্রপার্টি অ্যাক্সেস, এবং টাইপ কনভার্সন কার্যকরভাবে ক

াস্টমাইজ করতে পারেন।

Content added || updated By

Apache Commons BeanUtils লাইব্রেরি BeanUtilsBean ক্লাস প্রদান করে, যা BeanUtils এর জন্য একটি কাস্টম কনফিগারেশন এবং প্রপার্টি কপি, টাইপ কনভার্সন, বা টাইপ কাস্টমাইজেশনের কাজ করতে ব্যবহৃত হয়। সাধারণত, BeanUtilsBean ক্লাসটি BeanUtils এর কার্যকারিতা কাস্টমাইজ করার জন্য ব্যবহৃত হয়, যেখানে ডিফল্ট কনফিগারেশন উপযুক্ত না হলে কাস্টম কনভার্সন বা প্রপার্টি কপি প্রক্রিয়া করা যায়।

BeanUtilsBean এর মাধ্যমে আপনি কাস্টম কনভার্সন (custom conversion) এবং কাস্টম কপি (custom copy) প্রক্রিয়া সংজ্ঞায়িত করতে পারেন।

1. BeanUtilsBean ক্লাসের ভূমিকা

BeanUtilsBean ক্লাসটি মূলত BeanUtils লাইব্রেরির জন্য কাস্টম কনফিগারেশন দেয়। আপনি যদি কিছু নির্দিষ্ট প্রপার্টির জন্য কাস্টম কনভার্সন বা কাস্টম কপি প্রক্রিয়া করতে চান, তবে BeanUtilsBean এর মাধ্যমে এটি করা সম্ভব।

  • Customization: সাধারণত, BeanUtilsBean কাস্টম PropertyEditor বা Converter ব্যবহারের জন্য কাস্টম কনফিগারেশন সমর্থন করে।
  • এক্সটেনশন: আপনি যদি BeanUtils এর কিছু ডিফল্ট কার্যকারিতা পরিবর্তন করতে চান, তবে BeanUtilsBean ক্লাস এক্সটেন্ড (extend) করে সেই কার্যকারিতা কাস্টমাইজ করা সম্ভব।

2. BeanUtilsBean কাস্টমাইজ করার প্রক্রিয়া

আপনি BeanUtilsBean ক্লাস কাস্টমাইজ করার জন্য সাধারণত নিচের পদক্ষেপগুলি অনুসরণ করতে পারেন:

১. Custom Converter তৈরি করা

BeanUtils এর ডিফল্ট কনভার্সন পদ্ধতি যদি আপনার প্রয়োজন মেটাতে না পারে, তবে আপনি একটি কাস্টম Converter তৈরি করতে পারেন।

import org.apache.commons.beanutils.Converter;

public class MyCustomConverter implements Converter {
    @Override
    public Object convert(Class<?> type, Object value) {
        if (value == null) {
            return null;
        }

        if (value instanceof String) {
            String strValue = (String) value;
            // Custom conversion logic (e.g., trimming a string)
            return strValue.trim();
        }

        return value;
    }
}

২. BeanUtilsBean ক্লাস কাস্টমাইজ করা

এখন, BeanUtilsBean ক্লাস কাস্টমাইজ করতে হবে যাতে আমরা আমাদের কাস্টম কনভার্সন লজিক ব্যবহার করতে পারি।

import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.converters.DateConverter;
import org.apache.commons.beanutils.converters.IntegerConverter;

public class CustomBeanUtilsBean extends BeanUtilsBean {
    public CustomBeanUtilsBean() {
        // Registering custom converter for String to Integer conversion
        super();
        // Register your custom converter here
        this.getConvertUtils().register(new MyCustomConverter(), String.class);
    }

    @Override
    public void copyProperty(Object bean, String name, Object value) throws IllegalAccessException, InvocationTargetException {
        // Custom logic to copy properties
        super.copyProperty(bean, name, value);
    }
}

৩. BeanUtilsBean এর ব্যবহার

এখন আপনি কাস্টম BeanUtilsBean ব্যবহার করতে পারেন। আপনার তৈরি করা CustomBeanUtilsBean এর মাধ্যমে প্রপার্টি কপি এবং কাস্টম কনভার্সন করা হবে।

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.BeanUtilsBean;

public class CustomBeanUtilsExample {
    public static void main(String[] args) {
        try {
            // Create CustomBeanUtilsBean instance
            CustomBeanUtilsBean customBeanUtilsBean = new CustomBeanUtilsBean();

            // Source object
            Person person1 = new Person(" John Doe ", 30);

            // Target object
            Person person2 = new Person();

            // Copy properties with custom converter logic
            customBeanUtilsBean.copyProperties(person2, person1);

            // Output the result
            System.out.println("Name: " + person2.getName()); // Output: John Doe (Trimmed)
            System.out.println("Age: " + person2.getAge());   // Output: 30
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String name;
    private int age;

    public Person() {}

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    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;
    }
}

ব্যাখ্যা:

  • Custom Converter: এখানে আমরা একটি কাস্টম Converter তৈরি করেছি যা String কে ট্রিম করতে পারে।
  • Custom BeanUtilsBean: CustomBeanUtilsBean ক্লাস তৈরি করা হয়েছে যাতে আমরা কাস্টম কনভার্সন লজিক ব্যবহার করতে পারি।
  • Using copyProperties(): copyProperties() মেথড ব্যবহার করে কাস্টম কনভার্সন লজিক এবং প্রপার্টি কপি করা হচ্ছে।

3. BeanUtilsBean কাস্টমাইজেশনের আরও উদাহরণ

১. কাস্টম টাইপ কনভার্সন

ধরা যাক, আপনি একটি String প্রপার্টি থেকে Integer প্রপার্টিতে কাস্টম কনভার্সন করতে চান। আপনি এর জন্য কাস্টম কনভার্টার তৈরি করতে পারেন।

public class IntegerConverter implements Converter {
    @Override
    public Object convert(Class<?> type, Object value) {
        if (value instanceof String) {
            return Integer.parseInt((String) value);
        }
        return value;
    }
}

এটি ব্যবহার করতে, BeanUtilsBean কাস্টমাইজ করুন এবং কাস্টম কনভার্টার রেজিস্টার করুন।

২. কাস্টম টাইপ কনভার্সন এবং প্রপার্টি কপি

এখন, BeanUtilsBean কাস্টমাইজ করা হয়েছে যাতে কাস্টম টাইপ কনভার্সন এবং প্রপার্টি কপি করা যায়।

public class CustomBeanUtilsExample {
    public static void main(String[] args) {
        try {
            // Create CustomBeanUtilsBean instance
            CustomBeanUtilsBean customBeanUtilsBean = new CustomBeanUtilsBean();

            // Source object
            Person person1 = new Person("123", "John Doe");

            // Target object
            Person person2 = new Person();

            // Copy properties with custom converter logic
            customBeanUtilsBean.copyProperties(person2, person1);

            // Output the result
            System.out.println("ID: " + person2.getId()); // Output: 123 (String to Integer converted)
            System.out.println("Name: " + person2.getName()); // Output: John Doe
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Custom IntegerConverter: String থেকে Integer কনভার্ট করতে কাস্টম কনভার্টার তৈরি করা হয়েছে।
  • CustomBeanUtilsBean: CustomBeanUtilsBean কাস্টমাইজ করা হয়েছে যাতে কাস্টম কনভার্সন ব্যবহার করা হয়।

সারাংশ

BeanUtilsBean ক্লাসটি Apache Commons BeanUtils লাইব্রেরির জন্য কাস্টম কনফিগারেশন প্রদান করে। আপনি এটি ব্যবহার করে property copy এবং type conversion কাস্টমাইজ করতে পারেন। Custom converter তৈরি করে এবং BeanUtilsBean কাস্টমাইজ করে আপনি Java Bean-এর প্রপার্টি কপি বা টাইপ কনভার্সন প্রক্রিয়া সম্পূর্ণভাবে কাস্টমাইজ করতে পারবেন।

Content added || updated By

Apache Commons BeanUtils এবং Spring Framework উভয়ই Custom Converters এবং Property Editors ব্যবহার করে ডেটার টাইপ কনভার্সন এবং ম্যানিপুলেশন সহজ করে তোলে। Custom Converters এবং Property Editors ব্যবহার করার মাধ্যমে আপনি ডেটাকে নিজের নির্দিষ্ট প্রয়োজন অনুযায়ী কনভার্ট করতে বা ম্যানিপুলেট করতে পারবেন।


1. Custom Converters তৈরি করা (Apache Commons BeanUtils)

Apache Commons BeanUtils-এ Converter ইন্টারফেস ব্যবহার করে আপনি কাস্টম টাইপ কনভার্টার তৈরি করতে পারেন।

উদাহরণ: Custom Converter ব্যবহার করে String থেকে Custom Object কনভার্ট করা

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.beanutils.ConvertUtils;
import org.apache.commons.beanutils.Converter;

public class CustomConverterExample {
    public static void main(String[] args) {
        try {
            // Register the custom converter
            ConvertUtils.register(new StringToAddressConverter(), Address.class);

            // Source data
            String addressString = "Street 123, City A";

            // Target object
            Person person = new Person();

            // Set the address property using BeanUtils
            BeanUtils.setProperty(person, "address", addressString);

            // Output the converted Address object
            System.out.println("Street: " + person.getAddress().getStreet());
            System.out.println("City: " + person.getAddress().getCity());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

// Custom Converter: String to Address
class StringToAddressConverter implements Converter {
    @Override
    public Object convert(Class type, Object value) {
        if (value instanceof String) {
            String[] parts = ((String) value).split(", ");
            return new Address(parts[0], parts[1]);
        }
        return null;
    }
}

// Person class with Address property
class Person {
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

// Address class
class Address {
    private String street;
    private String city;

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public String getCity() {
        return city;
    }
}

ব্যাখ্যা:

  1. Custom Converter: StringToAddressConverter একটি কাস্টম কনভার্টার যা একটি String কে Address অবজেক্টে কনভার্ট করে।
  2. ConvertUtils.register(): এই মেথড ব্যবহার করে StringToAddressConverter রেজিস্টার করা হয়েছে।
  3. BeanUtils.setProperty(): এটি address প্রপার্টিতে String ভ্যালু সেট করার সময় কাস্টম কনভার্টার ব্যবহার করে ডেটা কনভার্ট করে।

2. Custom Property Editors তৈরি করা (Spring Framework)

Spring Framework-এ Property Editors ব্যবহার করে Bean-এর প্রপার্টি ম্যানিপুলেশন আরও সহজ করা যায়। PropertyEditorSupport ক্লাস ব্যবহার করে কাস্টম প্রপার্টি এডিটর তৈরি করা হয়।

উদাহরণ: Custom Property Editor ব্যবহার করে String থেকে Custom Object কনভার্ট করা

import org.springframework.beans.PropertyEditorRegistrar;
import org.springframework.beans.PropertyEditorRegistry;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.beans.PropertyEditorSupport;

public class CustomPropertyEditorExample {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        // Retrieve the person bean
        Person person = context.getBean(Person.class);

        // Output the converted Address object
        System.out.println("Street: " + person.getAddress().getStreet());
        System.out.println("City: " + person.getAddress().getCity());

        context.close();
    }
}

// Custom Property Editor
class AddressPropertyEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(String text) {
        String[] parts = text.split(", ");
        setValue(new Address(parts[0], parts[1]));
    }
}

// Person class
class Person {
    private Address address;

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

// Address class
class Address {
    private String street;
    private String city;

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    public String getStreet() {
        return street;
    }

    public String getCity() {
        return city;
    }
}

// Configuration class
@Configuration
class AppConfig {

    @Bean
    public Person person() {
        Person person = new Person();
        person.setAddress(new Address("Default Street", "Default City")); // Placeholder
        return person;
    }

    @Bean
    public PropertyEditorRegistrar propertyEditorRegistrar() {
        return new PropertyEditorRegistrar() {
            @Override
            public void registerCustomEditors(PropertyEditorRegistry registry) {
                registry.registerCustomEditor(Address.class, new AddressPropertyEditor());
            }
        };
    }
}

ব্যাখ্যা:

  1. AddressPropertyEditor: এটি একটি কাস্টম প্রপার্টি এডিটর যা একটি String কে Address অবজেক্টে কনভার্ট করে।
  2. PropertyEditorRegistrar: Spring-এ AddressPropertyEditor রেজিস্টার করার জন্য এই ক্লাস ব্যবহার করা হয়েছে।
  3. ApplicationContext: Spring এর ApplicationContext কনফিগার করে Person Bean-এ কাস্টম প্রপার্টি এডিটর প্রয়োগ করা হয়েছে।

Custom Converters বনাম Property Editors

বৈশিষ্ট্যCustom Converters (BeanUtils)Property Editors (Spring)
ব্যবহারBeanUtils-এ টাইপ কনভার্সনের জন্য।Spring Bean-এ প্রপার্টি ম্যানিপুলেশনের জন্য।
ফ্লেক্সিবিলিটিশুধুমাত্র টাইপ কনভার্সনের জন্য ব্যবহৃত।টাইপ কনভার্সন এবং আরও অনেক ক্ষেত্রে কার্যকর।
কনটেক্সটStandalone Bean-এ প্রযোজ্য।Spring Framework নির্ভর।
কোড জটিলতাতুলনামূলক সহজ।কিছুটা বেশি কনফিগারেশন প্রয়োজন।

সারাংশ

  • Custom Converters ব্যবহার করা হয় টাইপ কনভার্সনকে সহজ করতে, যেখানে Property Editors Spring Framework-এর কনটেক্সটে আরও উন্নত ম্যানিপুলেশন করতে সহায়ক।
  • Apache Commons BeanUtils এবং Spring Framework উভয়ই কাস্টমাইজড টাইপ কনভার্সনের জন্য শক্তিশালী সমাধান প্রদান করে।
  • আপনার প্রয়োজন এবং ব্যবহারের ক্ষেত্র অনুযায়ী Custom Converters বা Property Editors ব্যবহার করুন।
Content added || updated By

Apache Commons BeanUtils লাইব্রেরিতে BeanUtilsBean একটি বিশেষ ক্লাস যা BeanUtils এর বিভিন্ন কার্যকলাপ পরিচালনা করে, যেমন ডেটা কপি করা, টাইপ কনভার্সন এবং প্রপার্টি ম্যানিপুলেশন। BeanUtilsBean ক্লাসটি ডিফল্ট কনফিগারেশন সেটিংস সরবরাহ করে, তবে কিছু বিশেষ পরিস্থিতিতে আপনি এই কনফিগারেশন পরিবর্তন করতে চাইলে তা সম্ভব।

কনফিগারেশন পরিবর্তন করার উদ্দেশ্য:

  1. অতিরিক্ত প্রপার্টি সেটিং: ডিফল্ট কনফিগারেশন যদি আপনার প্রপার্টি ম্যানিপুলেশনের জন্য উপযুক্ত না হয়, তবে আপনি BeanUtilsBean ব্যবহার করে কাস্টম সেটিংস অ্যাপ্লাই করতে পারেন।
  2. টাইপ কনভার্সন: টাইপ কনভার্সন কাস্টমাইজ করতে, যেমন String থেকে Integer কনভার্ট করা, বা অন্য কোন নির্দিষ্ট কনভার্সন পদ্ধতি ব্যবহার করা।
  3. Error Handling: ডিফল্ট error handling পরিবর্তন করতে এবং কাস্টম conversion errors বা property access errors হ্যান্ডল করতে BeanUtilsBean এর সাহায্য নিতে পারেন।

BeanUtilsBean ক্লাসের মাধ্যমে কনফিগারেশন পরিবর্তন করা

BeanUtilsBean ক্লাসের কিছু মূল কনফিগারেশন সেটিংস পরিবর্তন করার জন্য, আপনি BeanUtilsBean এর setInstance() মেথড ব্যবহার করে একটি কাস্টম ইনস্ট্যান্স তৈরি করতে পারেন।

উদাহরণ: BeanUtilsBean এর কনফিগারেশন পরিবর্তন করা

import org.apache.commons.beanutils.BeanUtilsBean;
import org.apache.commons.beanutils.converters.DateConverter;

public class BeanUtilsCustomConfigExample {
    public static void main(String[] args) {
        try {
            // Create a custom DateConverter to convert strings to Date
            DateConverter dateConverter = new DateConverter(null);
            dateConverter.setPatterns(new String[]{"yyyy-MM-dd", "MM/dd/yyyy"});

            // Create a custom BeanUtilsBean with the custom converter
            BeanUtilsBean beanUtilsBean = new BeanUtilsBean();
            beanUtilsBean.getConvertUtils().register(dateConverter, java.util.Date.class);

            // Use the custom BeanUtilsBean for property copying
            Person source = new Person("John", "2024-11-15");
            Person target = new Person();
            beanUtilsBean.copyProperties(target, source);

            // Output the result
            System.out.println("Name: " + target.getName());  // Output: John
            System.out.println("Birthdate: " + target.getBirthdate());  // Output: 2024-11-15

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String name;
    private java.util.Date birthdate;

    public Person() {}

    public Person(String name, String birthdate) throws Exception {
        this.name = name;
        // Convert the string to a Date
        this.birthdate = new java.text.SimpleDateFormat("yyyy-MM-dd").parse(birthdate);
    }

    public String getName() {
        return name;
    }

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

    public java.util.Date getBirthdate() {
        return birthdate;
    }

    public void setBirthdate(java.util.Date birthdate) {
        this.birthdate = birthdate;
    }
}

ব্যাখ্যা:

  1. Custom Converter: এখানে আমরা একটি DateConverter তৈরি করেছি যা String থেকে Date কনভার্সন করতে ব্যবহৃত হয়। দুটি তারিখের ফরম্যাট যোগ করা হয়েছে (যেমন yyyy-MM-dd, MM/dd/yyyy)।
  2. BeanUtilsBean Instance: এরপর একটি BeanUtilsBean এর কাস্টম ইনস্ট্যান্স তৈরি করা হয়েছে, যেখানে আমাদের কাস্টম DateConverter রেজিস্টার করা হয়েছে। এরপর copyProperties() ব্যবহার করে ডেটা কপি করা হয়েছে।
  3. কাস্টম কনভার্সন: যখন BeanUtilsBean কাস্টম কনভার্সন ব্যবহার করে ডেটা কপি করা হয়েছে, তখন String থেকে Date কনভার্সন সঠিকভাবে সম্পন্ন হয়েছে।

BeanUtilsBean এর কিছু গুরুত্বপূর্ণ কনফিগারেশন অপশন:

  1. Type Conversion:
    • আপনি Type Converters কাস্টমাইজ করতে পারেন, যেমন DateConverter, BooleanConverter, IntegerConverter, ইত্যাদি। এগুলি setPatterns() অথবা setDefaultValue() মেথডের মাধ্যমে কনফিগার করা যায়।
  2. Error Handling:
    • আপনি BeanUtilsBean এর setStrictMethodInvocation(true) সেট করতে পারেন, যা strict mode চালু করে এবং প্যারামিটার মিসিং হলে IllegalAccessException ছুঁড়ে দেয়।
    • আপনি setPropertyUtilsBean() ব্যবহার করে PropertyUtilsBean এর কাস্টম কনফিগারেশন সেট করতে পারেন।
  3. MethodInvocation Customization:
    • ডিফল্টভাবে, BeanUtils প্রপার্টি অ্যাক্সেসের জন্য getter এবং setter মেথড ব্যবহার করে। তবে আপনি setMethodAccessor() এর মাধ্যমে কাস্টম মেথড অ্যাক্সেসর সেট করতে পারেন।
  4. Custom Property Names:
    • আপনি convertUtils এর মাধ্যমে কাস্টম property naming strategies ব্যবহার করতে পারেন। এর মাধ্যমে, প্রপার্টি নামের মধ্যে পরিবর্তন আনা সম্ভব হয়।

সারাংশ:

  • BeanUtilsBean হল Apache Commons BeanUtils লাইব্রেরির মূল অংশ যা প্রপার্টি কপি, টাইপ কনভার্সন, এবং অন্যান্য কার্যকলাপ পরিচালনা করে।
  • আপনি BeanUtilsBean এর কনফিগারেশন পরিবর্তন করে type converters, error handling, এবং method invocation কাস্টমাইজ করতে পারেন।
  • কাস্টম কনফিগারেশনগুলি আপনাকে আরও উন্নত কন্ট্রোল এবং ফ্লেক্সিবিলিটি প্রদান করে, বিশেষ করে যখন আপনার প্রোজেক্টে জটিল ডেটা ম্যানিপুলেশন প্রয়োজন।
Content added || updated By

Apache Commons BeanUtilsBean একটি অত্যন্ত শক্তিশালী ক্লাস যা BeanUtils লাইব্রেরির অন্তর্গত এবং এটি Java Beans-এর মধ্যে প্রপার্টি কপি এবং টাইপ কনভার্সন কার্যক্রম আরও কার্যকরীভাবে পরিচালনা করতে ব্যবহৃত হয়। এটি বিশেষভাবে অনেক প্রকারের conversion, type-safe কপি, এবং deep copy এর জন্য সহায়ক।

এখানে কিছু real-world use cases উল্লেখ করা হলো যেখানে BeanUtilsBean খুবই কার্যকরী হতে পারে।


১. Data Transfer Objects (DTOs) - Web Services Integration

ধরা যাক আপনি একটি RESTful Web Service তৈরি করেছেন এবং সেখানে ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা স্থানান্তরের জন্য DTOs (Data Transfer Objects) ব্যবহার করছেন। DTOs ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা পরিবহনের জন্য ব্যবহৃত হয় এবং এই DTO গুলি সাধারণত Java Beans।

এখন, আপনি যদি server-side beans থেকে DTO-এ ডেটা কপি করতে চান, BeanUtilsBean অত্যন্ত সহায়ক হতে পারে।

উদাহরণ: Web Service-এ DTO Mapping

import org.apache.commons.beanutils.BeanUtilsBean;

public class BeanUtilsBeanExample {
    public static void main(String[] args) {
        try {
            // Create a Person entity (this would be your model object)
            Person personEntity = new Person("John", "Doe", 30);

            // Create a PersonDTO to transfer the data
            PersonDTO personDTO = new PersonDTO();

            // Copy properties from Person entity to PersonDTO using BeanUtilsBean
            BeanUtilsBean.getInstance().copyProperties(personDTO, personEntity);

            // Output the transferred data
            System.out.println("Person DTO Name: " + personDTO.getFirstName() + " " + personDTO.getLastName());
            System.out.println("Person DTO Age: " + personDTO.getAge());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    // Getters and setters
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class PersonDTO {
    private String firstName;
    private String lastName;
    private int age;

    // Getters and setters
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

ব্যাখ্যা:

  • BeanUtilsBean.getInstance().copyProperties() ব্যবহার করে Person (Entity Bean) থেকে PersonDTO (DTO) তে ডেটা কপি করা হয়েছে।
  • এই পদ্ধতিতে, firstName, lastName, এবং age ফিল্ডগুলি ডায়নামিকভাবে কপি করা হচ্ছে।

এই ধরনের DTO mapping ব্যবহারিকভাবে ওয়েব সার্ভিসগুলিতে এবং ক্লায়েন্ট-সার্ভার যোগাযোগে খুবই সহায়ক।


২. Database Entity to DTO Mapping - Persistence Layer Integration

যখন আপনি ডেটাবেসের Entity থেকে DTO তে ডেটা স্থানান্তর করেন, তখন BeanUtilsBean ডেটা কপি করার জন্য একটি কার্যকরী সমাধান হতে পারে। ধরুন, আপনি JPA (Java Persistence API) ব্যবহার করে ডেটাবেস থেকে ডেটা নিয়ে আসছেন এবং সেই ডেটাকে DTO তে কনভার্ট করতে চান।

উদাহরণ: JPA Entity to DTO Mapping

import org.apache.commons.beanutils.BeanUtilsBean;
import java.util.List;
import java.util.ArrayList;

public class EntityToDTOExample {
    public static void main(String[] args) {
        try {
            // Creating a list of Person entities
            List<Person> personList = new ArrayList<>();
            personList.add(new Person("Alice", "Smith", 28));
            personList.add(new Person("Bob", "Johnson", 35));

            // Creating a list of PersonDTO to store the mapped DTOs
            List<PersonDTO> personDTOList = new ArrayList<>();

            // Using BeanUtilsBean to copy properties from Person entity to PersonDTO
            for (Person person : personList) {
                PersonDTO personDTO = new PersonDTO();
                BeanUtilsBean.getInstance().copyProperties(personDTO, person);
                personDTOList.add(personDTO);
            }

            // Output the DTOs
            for (PersonDTO dto : personDTOList) {
                System.out.println("DTO Name: " + dto.getFirstName() + " " + dto.getLastName());
                System.out.println("DTO Age: " + dto.getAge());
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String firstName;
    private String lastName;
    private int age;

    public Person(String firstName, String lastName, int age) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.age = age;
    }

    // Getters and setters
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class PersonDTO {
    private String firstName;
    private String lastName;
    private int age;

    // Getters and setters
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

ব্যাখ্যা:

  • BeanUtilsBean.getInstance().copyProperties() ব্যবহার করে, Person Entity থেকে PersonDTO তে ডেটা কপি করা হয়েছে।
  • এখানে List ব্যবহার করা হয়েছে যাতে multiple entities কে DTO-তে ম্যাপ করা যায়।

এটি Persistence Layer (ডেটাবেস থেকে Entity অবজেক্ট) এবং Service Layer (DTO) এর মধ্যে ডেটা স্থানান্তরের জন্য কার্যকরী।


৩. Form Data Binding in Web Applications

ওয়েব অ্যাপ্লিকেশনে, ফর্মের ডেটা থেকে Java Bean-এ ডেটা বाइন্ডিং করার জন্য BeanUtilsBean ব্যবহৃত হয়। সাধারণত ওয়েব ফ্রেমওয়ার্ক যেমন Spring MVC-এ ফর্ম ডেটা সঠিকভাবে Bean-এ পপুলেট করতে BeanUtilsBean সাহায্য করতে পারে।

উদাহরণ: Form Data Binding in Spring MVC

import org.apache.commons.beanutils.BeanUtilsBean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ModelAttribute;

@Controller
public class PersonController {

    @RequestMapping(value = "/submitForm", method = RequestMethod.POST)
    public String handleFormSubmission(@ModelAttribute PersonDTO personDTO, Model model) {
        try {
            Person personEntity = new Person();
            // Copy properties from DTO to Entity using BeanUtilsBean
            BeanUtilsBean.getInstance().copyProperties(personEntity, personDTO);

            // Add the personEntity to model
            model.addAttribute("person", personEntity);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "personDetails"; // return a view to display the person data
    }
}

ব্যাখ্যা:

  • Spring MVC-এ ফর্ম ডেটা PersonDTO তে চলে আসে এবং তা BeanUtilsBean দিয়ে Person Entity-এ পপুলেট করা হয়।
  • PersonDTO এবং Person Entity এর মধ্যে প্রপার্টি কপি করার জন্য copyProperties() মেথড ব্যবহার করা হয়েছে।

৪. Unit Testing and Mocking

BeanUtilsBean লাইব্রেরি

ব্যবহার করে আপনি Unit Testing এর মধ্যে mock beans তৈরি করতে পারেন। এক্ষেত্রে আপনি Mockito এর মতো টেস্টিং লাইব্রেরি ব্যবহার করে mock objects তৈরি করতে পারেন এবং BeanUtilsBean এর মাধ্যমে তাদের মধ্যে ডেটা কপি করতে পারেন।


সারাংশ

BeanUtilsBean হল Apache Commons BeanUtils লাইব্রেরির একটি গুরুত্বপূর্ণ অংশ, যা real-world applications-এ বিভিন্ন কার্যক্রমে ব্যবহৃত হয় যেমন DTO mapping, Entity mapping, Form data binding, এবং Unit Testing। এটি ডেটা কপি এবং টাইপ কনভার্সন প্রক্রিয়া সহজ করে এবং Java Beans-এর মধ্যে ডেটা স্থানান্তরের কাজকে কার্যকরীভাবে সম্পন্ন করে।

Content added || updated By
Promotion

Are you sure to start over?

Loading...