Custom Mapping Methods এবং Reusability

Java Technologies - ম্যাপস্ট্রাক্ট (MapStruct) - MapStruct এর জন্য Best Practices
134

MapStruct হল একটি জনপ্রিয় Java লাইব্রেরি যা ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং করার জন্য ব্যবহৃত হয়। Custom Mapping Methods এবং Reusability হল MapStruct এর অন্যতম শক্তিশালী বৈশিষ্ট্য। এর মাধ্যমে আপনি নিজস্ব কাস্টম লজিক প্রয়োগ করে ম্যাপিং কোড তৈরি করতে পারেন এবং সেই কোড পুনরায় ব্যবহার করতে পারেন।

এই টিউটোরিয়ালে, আমরা Custom Mapping Methods এবং Reusability এর ধারণা এবং কিভাবে এগুলি ব্যবহার করা যায় তা উদাহরণ সহ আলোচনা করব।


১. Custom Mapping Methods এর প্রয়োজনীয়তা

MapStruct স্বয়ংক্রিয়ভাবে ম্যাপিং কোড জেনারেট করে, কিন্তু কখনও কখনও আপনি কিছু কাস্টম ম্যাপিং লজিক প্রয়োগ করতে চান, যেমন:

  • একটি ফিল্ড থেকে অন্য ফিল্ডে ডেটা ট্রান্সফর্ম করা।
  • একটি ফিল্ডের ডেটা ফরম্যাট পরিবর্তন করা।
  • বিভিন্ন ডেটা টাইপের মধ্যে কনভার্সন করা।

এখানে, Custom Mapping Methods আপনাকে এই সব কাস্টম লজিক প্রয়োগ করার সুযোগ দেয়।

উদাহরণ:

ধরা যাক, একটি Person অবজেক্টে fullName ফিল্ডটি একটি String হিসেবে ধারণ করা হয়, এবং আমরা firstName এবং lastName ফিল্ডে এই ডেটা ম্যাপ করতে চাই।

২. Custom Mapping Method Example

Person.java (Domain Object)

public class Person {
    private String fullName;
    
    // Getters and Setters
}

PersonDTO.java (DTO Object)

public class PersonDTO {
    private String firstName;
    private String lastName;

    // Getters and Setters
}

PersonMapper.java (MapStruct Mapper Interface)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    // Custom mapping method
    @Mapping(target = "firstName", expression = "java(extractFirstName(person.getFullName()))")
    @Mapping(target = "lastName", expression = "java(extractLastName(person.getFullName()))")
    PersonDTO personToPersonDTO(Person person);
    
    default String extractFirstName(String fullName) {
        return fullName != null && fullName.contains(" ") ? fullName.split(" ")[0] : "";
    }

    default String extractLastName(String fullName) {
        return fullName != null && fullName.contains(" ") ? fullName.split(" ")[1] : "";
    }
}

এখানে, PersonMapper ইন্টারফেসে দুটি কাস্টম মেথড ব্যবহার করা হয়েছে (extractFirstName এবং extractLastName), যা fullName থেকে প্রথম এবং শেষ নাম বের করে এবং DTO তে সেট করে।

Main.java (Usage Example)

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setFullName("John Doe");

        PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
        System.out.println("First Name: " + personDTO.getFirstName()); // John
        System.out.println("Last Name: " + personDTO.getLastName());   // Doe
    }
}

এখানে, PersonMapper ইন্টারফেসটি fullName কে কাস্টম লজিক ব্যবহার করে firstName এবং lastName এ ম্যাপিং করেছে।


৩. Reusability in Custom Mapping Methods

MapStruct এর মাধ্যমে আপনি কাস্টম ম্যাপিং মেথডগুলো পুনরায় ব্যবহার করতে পারেন, যা কোডের পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণযোগ্যতা বৃদ্ধি করে। উদাহরণস্বরূপ, যদি একাধিক Mapper ইন্টারফেসে একই কাস্টম লজিক প্রয়োজন হয়, তবে আপনি সেই কাস্টম মেথডগুলো একটি অ্যাবস্ট্র্যাক্ট ক্লাস বা ইন্টারফেসে লিখে পুনরায় ব্যবহার করতে পারেন।

উদাহরণ: Reusable Custom Mapping Method

StringUtil.java (Utility Class)

public class StringUtil {
    public static String extractFirstName(String fullName) {
        return fullName != null && fullName.contains(" ") ? fullName.split(" ")[0] : "";
    }

    public static String extractLastName(String fullName) {
        return fullName != null && fullName.contains(" ") ? fullName.split(" ")[1] : "";
    }
}

PersonMapper.java (MapStruct Mapper Interface)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(target = "firstName", expression = "java(StringUtil.extractFirstName(person.getFullName()))")
    @Mapping(target = "lastName", expression = "java(StringUtil.extractLastName(person.getFullName()))")
    PersonDTO personToPersonDTO(Person person);
}

এখানে, StringUtil ক্লাসে কাস্টম লজিক লেখা হয়েছে এবং PersonMapper তে সেই লজিক ব্যবহার করা হয়েছে। এই কাস্টম মেথডগুলো এখন যেকোনো Mapper এ ব্যবহার করা যাবে, যা কোড পুনঃব্যবহারযোগ্যতা বৃদ্ধি করবে।


৪. Custom Mapping Method with Complex Objects

কাস্টম ম্যাপিং মেথড ব্যবহার করা হয় যখন আপনি একাধিক প্রপার্টি বা ডোমেইন অবজেক্টের মধ্যে জটিল ম্যাপিং করতে চান। এখানে address নামক একটি কমপ্লেক্স অবজেক্ট ব্যবহার করে ম্যাপিং দেখানো হবে।

উদাহরণ: Complex Object Mapping

Address.java (Complex Object)

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

    // Getters and Setters
}

Person.java (Domain Object)

public class Person {
    private String fullName;
    private Address address;

    // Getters and Setters
}

PersonDTO.java (DTO Object)

public class PersonDTO {
    private String fullName;
    private String addressInfo; // City and Street info
    
    // Getters and Setters
}

PersonMapper.java (MapStruct Mapper Interface with Custom Mapping Method)

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    @Mapping(target = "addressInfo", expression = "java(mapAddress(person.getAddress()))")
    PersonDTO personToPersonDTO(Person person);

    default String mapAddress(Address address) {
        return address != null ? address.getCity() + ", " + address.getStreet() : "Unknown";
    }
}

এখানে, mapAddress কাস্টম মেথডটি Address অবজেক্টকে একটি String এ রূপান্তরিত করছে এবং সেই স্ট্রিংটি PersonDTO এর addressInfo ফিল্ডে সেট করা হচ্ছে।


৫. Custom Mapping Method Usage Example

public class Main {
    public static void main(String[] args) {
        Address address = new Address();
        address.setCity("New York");
        address.setStreet("5th Avenue");

        Person person = new Person();
        person.setFullName("John Doe");
        person.setAddress(address);

        // Mapping using custom method
        PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
        System.out.println("Full Name: " + personDTO.getFullName());
        System.out.println("Address Info: " + personDTO.getAddressInfo());
    }
}

এখানে, mapAddress কাস্টম মেথডটি Address অবজেক্ট থেকে city এবং street কে একটি স্ট্রিং এ রূপান্তরিত করে PersonDTO তে সেট করেছে।


সারাংশ

Custom Mapping Methods MapStruct এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে জটিল এবং কাস্টম লজিক প্রয়োগ করার সুযোগ দেয়। আপনি যখন ডোমেইন অবজেক্ট থেকে DTO তে ডেটা ম্যাপিং করেন, তখন কাস্টম মেথড ব্যবহার করে প্রয়োজনীয় কনভার্সন বা ট্রান্সফরমেশন করতে পারেন। এছাড়া, MapStruct এর মাধ্যমে কোডের reusability নিশ্চিত করা যায়, কারণ আপনি একবার কাস্টম মেথড তৈরি করলে তা পুনরায় ব্যবহার করা সম্ভব। এর মাধ্যমে আপনার কোড আরও পরিষ্কার এবং রক্ষণাবেক্ষণযোগ্য হয়।


Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...