MapStruct একটি Java mapping ফ্রেমওয়ার্ক যা ডোমেইন অবজেক্ট (POJOs) এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ডেটা ম্যাপিং করতে ব্যবহৃত হয়। MapStruct এর মাধ্যমে আপনি expression এবং method reference ব্যবহার করে কাস্টম ম্যাপিং এবং কনভার্সন লজিক যোগ করতে পারেন।
এই টিউটোরিয়ালে, আমরা expression এবং method reference ব্যবহার করে MapStruct ম্যাপিং কিভাবে কাস্টমাইজ করতে পারি তা দেখব। এগুলি ব্যবহার করে আপনি ম্যাপিং প্রক্রিয়াকে আরও নমনীয় এবং শক্তিশালী করতে পারবেন।
১. MapStruct Expression ব্যবহার করা
Expression ব্যবহারের মাধ্যমে আপনি একটি Java Expression নির্দিষ্ট করতে পারেন যা ম্যাপিংয়ের সময় ব্যবহার করা হবে। এটি একটি custom expression হিসেবে ব্যবহৃত হয়, যেখানে আপনি Java কোড লিখে নির্দিষ্ট ট্রান্সফরমেশন বা কনভার্সন লজিক পরিচালনা করতে পারেন।
উদাহরণ: Expression ব্যবহার
ধরা যাক, আমাদের একটি Employee ডোমেইন অবজেক্ট রয়েছে, এবং EmployeeDTO তে নাম এবং বয়সের উপর কিছু কাস্টম ম্যাপিং করতে হবে।
Employee.java (Domain Object)
public class Employee {
private String name;
private int age;
// Getters and Setters
}
EmployeeDTO.java (DTO)
public class EmployeeDTO {
private String employeeName;
private int employeeAge;
// Getters and Setters
}
এখন, আমরা MapStruct এর মাধ্যমে Employee থেকে EmployeeDTO তে ডেটা ম্যাপিং করব এবং name ফিল্ডটি কাস্টম স্ট্রিং ফর্ম্যাটে পরিবর্তন করব।
EmployeeMapper.java (Mapper Interface)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface EmployeeMapper {
// Using custom expression to map the name field
@Mapping(target = "employeeName", expression = "java(employee.getName().toUpperCase())")
@Mapping(source = "age", target = "employeeAge")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, employeeName ফিল্ডে expression ব্যবহার করা হয়েছে, যা employee.getName() কে toUpperCase() করে বড় অক্ষরে রূপান্তরিত করবে। MapStruct এই expression কে compile-time এ কোড জেনারেট করবে।
২. MapStruct Method Reference ব্যবহার করা
Method Reference MapStruct এ কাস্টম ম্যাপিং করার আরেকটি উপায়। Method Reference ব্যবহার করে আপনি একটি মেথডকে রেফারেন্স করতে পারেন যা ম্যাপিংয়ের জন্য কাস্টম কনভার্সন লজিক সরবরাহ করবে। এটি Java 8 এর ফিচার যা মেথড রেফারেন্স করতে সক্ষম।
উদাহরণ: Method Reference ব্যবহার
ধরা যাক, আমাদের Employee এবং EmployeeDTO ক্লাসের মধ্যে কিছু কাস্টম ট্রান্সফরমেশন করতে হবে। আমরা toUpperCase মেথডের জন্য একটি কাস্টম মেথড তৈরি করব এবং সেটি method reference হিসেবে ব্যবহার করব।
EmployeeMapper.java (Mapper Interface)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface EmployeeMapper {
// Using method reference to map the name field
@Mapping(target = "employeeName", source = "name", qualifiedByName = "toUpperCase")
@Mapping(source = "age", target = "employeeAge")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
// Custom method for toUpperCase conversion
default String toUpperCase(String name) {
return name != null ? name.toUpperCase() : null;
}
}
এখানে, qualifiedByName ব্যবহার করা হয়েছে toUpperCase মেথড রেফারেন্সে। মেপিংয়ের সময়, Employee অবজেক্টের name ফিল্ডকে toUpperCase মেথডের মাধ্যমে কাস্টম কনভার্সনে রূপান্তরিত করা হবে।
৩. Expression এবং Method Reference এর মধ্যে পার্থক্য
- Expression: এখানে আপনি সরাসরি Java এক্সপ্রেশন লিখতে পারেন, যা ম্যাপিং ফিল্ডের মধ্যে কাস্টম কনভার্সন প্রয়োগ করবে।
- Method Reference: এখানে আপনি কোনো বিদ্যমান মেথড ব্যবহার করতে পারেন, এবং সেটি ম্যাপিং প্রক্রিয়ায় ব্যবহৃত হবে। এটি default মেথড বা সাধারণ মেথড হতে পারে যা কাস্টম কনভার্সন লজিক সম্পাদন করে।
৪. Expression এবং Method Reference এর সুবিধা
- Custom Transformation: এই ফিচারগুলির মাধ্যমে আপনি ম্যাপিংয়ের জন্য কাস্টম লজিক যুক্ত করতে পারেন, যা আপনাকে আরও নমনীয় কনভার্সন প্রদান করে।
- Type Safety: MapStruct আপনাকে টাইপ সেফ কনভার্সন প্রদান করে, যার ফলে টাইপ মিসম্যাচের কারণে ত্রুটি এড়ানো যায়।
- Code Generation: MapStruct কোড জেনারেট করে, তাই আপনি কম সময়ে দ্রুত ম্যাপিং কাজ করতে পারবেন।
সারাংশ
MapStruct এর মাধ্যমে expression এবং method reference ব্যবহার করে আপনি কাস্টম ম্যাপিং এবং কনভার্সন লজিক যুক্ত করতে পারেন, যা ম্যাপিংয়ের জটিলতা কমিয়ে সহজ এবং কার্যকরী করে। Expression ব্যবহার করে আপনি সরাসরি Java এক্সপ্রেশন ব্যবহার করতে পারেন এবং Method Reference ব্যবহার করে কোনো বিদ্যমান কাস্টম মেথড ব্যবহার করতে পারেন। এই ফিচারগুলি আপনাকে কাস্টম ডেটা কনভার্সন এবং ট্রান্সফরমেশন আরও সহজ এবং সুগম করে তোলে।
MapStruct হল একটি শক্তিশালী Java লাইব্রেরি যা ডোমেইন অবজেক্ট (POJO) এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে সহজভাবে ম্যাপিং করতে সহায়তা করে। কখনও কখনও, আমাদের কাস্টম লজিক প্রয়োগ করতে হয় যখন ডেটা কনভার্সন সাধারণ ম্যাপিং নিয়ম দ্বারা সম্ভব হয় না। এর জন্য MapStruct Expression এবং Method Reference ফিচার প্রদান করে, যা বিশেষ ধরনের কাস্টম ম্যাপিং লজিক প্রয়োগ করতে সাহায্য করে।
এই টিউটোরিয়ালে, আমরা Expression এবং Method Reference এর ধারণা এবং এগুলির মাধ্যমে কিভাবে ম্যাপিং কার্যক্রম করা যায় তা দেখব।
১. Expression Mapping
Expression Mapping ব্যবহার করে আপনি MapStruct এর মধ্যে কাস্টম লজিক প্রয়োগ করতে পারেন। এতে আপনি Java Expression ব্যবহার করে সরাসরি একটি কাস্টম কনভার্সন লজিক প্রদান করতে পারেন।
Expression Mapping এর ধারণা
Expression Mapping হল সেই ক্ষেত্র যেখানে আপনি MapStruct এর @Mapping অ্যানোটেশনের মাধ্যমে Java Expressions ব্যবহার করে ফিল্ডের মান কনভার্ট করেন। এটি খুবই শক্তিশালী এবং কার্যকরী, বিশেষ করে যখন আপনি কাস্টম ট্রান্সফর্মেশন বা কনভার্সন প্রয়োগ করতে চান।
Expression Mapping Example:
ধরা যাক, আমাদের একটি Person ক্লাস এবং একটি PersonDTO ক্লাস রয়েছে। আমরা PersonDTO এর fullName ফিল্ডে Person এর firstName এবং lastName ফিল্ডের মান যোগ করতে চাই।
Person.java:
public class Person {
private String firstName;
private String lastName;
// Getters and Setters
}
PersonDTO.java:
public class PersonDTO {
private String fullName;
// Getters and Setters
}
PersonMapper.java (MapStruct Mapper Interface):
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
@Mapping(target = "fullName", expression = "java(person.getFirstName() + \" \" + person.getLastName())")
PersonDTO personToPersonDTO(Person person);
}
এখানে, expression প্রপার্টি ব্যবহার করে আমরা firstName এবং lastName যোগ করে fullName তৈরি করেছি। java() ব্লকের মধ্যে কাস্টম Java Expression দেওয়া হয়েছে।
২. Method Reference Mapping
Method Reference Mapping এর মাধ্যমে আপনি MapStruct এর @Mapping অ্যানোটেশন ব্যবহার করে একটি মেথডের মাধ্যমে কাস্টম ম্যাপিং লজিক প্রয়োগ করতে পারেন। যখন আপনি কোনো কাস্টম কনভার্সন মেথড তৈরি করতে চান, তখন এই ফিচারটি ব্যবহার করা হয়।
Method Reference Mapping এর ধারণা
Method Reference হল একটি পদ্ধতি যেখানে আপনি ম্যাপিং করার জন্য একটি বিদ্যমান মেথডকে রেফারেন্স হিসেবে ব্যবহার করেন। এটি MapStruct কে নির্দেশ করে যে একটি নির্দিষ্ট মেথড ব্যবহার করে কাস্টম ম্যাপিং সম্পন্ন করতে হবে।
Method Reference Mapping Example:
ধরা যাক, Person ক্লাস থেকে PersonDTO ক্লাসে কিছু কাস্টম লজিক প্রয়োগ করতে হবে এবং এটি একটি আলাদা মেথড দিয়ে সম্পন্ন করতে হবে।
Person.java:
public class Person {
private String firstName;
private String lastName;
// Getters and Setters
}
PersonDTO.java:
public class PersonDTO {
private String fullName;
// Getters and Setters
}
PersonMapper.java (MapStruct Mapper Interface):
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
@Mapping(target = "fullName", source = "person", qualifiedByName = "combineNames")
PersonDTO personToPersonDTO(Person person);
// Custom Method to combine firstName and lastName
default String combineNames(Person person) {
return person.getFirstName() + " " + person.getLastName();
}
}
এখানে, combineNames() মেথডটি qualifiedByName এর মাধ্যমে রেফারেন্স করা হয়েছে এবং Person অবজেক্টের firstName এবং lastName একসাথে যোগ করে fullName তৈরি করা হচ্ছে।
৩. Expression এবং Method Reference এর মধ্যে পার্থক্য
| Feature | Expression Mapping | Method Reference Mapping |
|---|---|---|
| Definition | Java expressions used directly inside @Mapping | References to custom methods for mapping |
| Use Case | Simple and small custom mappings | Complex or reusable mappings |
| Performance | Direct expression evaluation at compile-time | Method call, slightly more overhead than expression |
| Flexibility | Less flexible for complex logic | More flexible for complex logic and reusability |
৪. MapStruct এ Expression এবং Method Reference এর ব্যবহার
- Expression Mapping সহজ এবং ছোট ট্রান্সফর্মেশন করতে ব্যবহৃত হয়। এটি তখন ব্যবহার করা হয় যখন আপনি দ্রুত একটি কাস্টম কনভার্সন ফাংশন বা লজিক প্রয়োগ করতে চান।
- Method Reference Mapping ব্যবহৃত হয় যখন কাস্টম ম্যাপিং লজিক জটিল বা পুনরাবৃত্তি হয়ে থাকে এবং আপনি সেই লজিক আলাদা মেথডে রাখতে চান। এটি কোড পুনঃব্যবহারের জন্য উপযোগী।
Combine Example:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
// Expression Example
@Mapping(target = "fullName", expression = "java(person.getFirstName() + \" \" + person.getLastName())")
PersonDTO personToPersonDTO(Person person);
// Method Reference Example
@Mapping(target = "fullName", source = "person", qualifiedByName = "combineNames")
PersonDTO personToPersonDTOUsingMethod(Person person);
default String combineNames(Person person) {
return person.getFirstName() + " " + person.getLastName();
}
}
এখানে আমরা দুটি পদ্ধতি দেখিয়েছি: একটি Expression Mapping এবং আরেকটি Method Reference Mapping ব্যবহার করে।
সারাংশ
MapStruct এর মাধ্যমে Expression Mapping এবং Method Reference Mapping এর ব্যবহার কাস্টম ম্যাপিং লজিক প্রয়োগ করার জন্য খুবই উপকারী। Expression Mapping সহজ এবং ছোট কাস্টম কনভার্সন প্রয়োগের জন্য উপযুক্ত, যখন Method Reference Mapping জটিল বা পুনরাবৃত্তি কাস্টম লজিক প্রয়োগের জন্য ব্যবহৃত হয়। MapStruct এর এই ফিচার দুটি আপনাকে আরও শক্তিশালী এবং নমনীয় ম্যাপিং অপারেশন তৈরি করতে সহায়তা করে।
MapStruct একটি জনপ্রিয় Java মডেল ম্যাপিং ফ্রেমওয়ার্ক, যা অটোমেটিক ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং সম্পন্ন করতে ব্যবহৃত হয়। MapStruct ডিফল্ট ম্যাপিং লজিকের বাইরে গিয়ে কাস্টম লজিক প্রয়োগ করতে সহায়তা করে। এর মধ্যে একটি শক্তিশালী বৈশিষ্ট্য হল @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট, যা আপনি যখন প্রপার্টি ম্যাপিংয়ের জন্য কাস্টম এক্সপ্রেশন বা লজিক প্রয়োগ করতে চান তখন ব্যবহার করতে পারেন।
এটি বিশেষত তখন উপকারী, যখন আপনি একটি ফিল্ডের মানের উপর নির্ভর করে ম্যাপিং করতে চান, যেমন বিভিন্ন ডেটা ফর্ম্যাট বা কাস্টম কনভার্সন।
এই টিউটোরিয়ালে, আমরা MapStruct এর @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করে কাস্টম ম্যাপিং এবং কনভার্সন করার কিছু উদাহরণ দেখব।
১. @Mapping এর expression অ্যাট্রিবিউট ব্যবহার
@Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করে আপনি Java এক্সপ্রেশন লিখতে পারেন যা ম্যাপিং অপারেশন সম্পাদন করবে। এর মাধ্যমে, আপনি জাভা কোড হিসেবে কাস্টম লজিক প্রয়োগ করতে পারেন, যেমন যোগফল বা নির্দিষ্ট ধরণের কনভার্সন।
উদাহরণ: String থেকে Integer ম্যাপিং
ধরা যাক, আপনার কাছে একটি PersonDTO ক্লাস আছে এবং আপনি ageString নামক একটি স্ট্রিং প্রপার্টি থেকে age নামক একটি ইন্টিজার প্রপার্টিতে মান ম্যাপ করতে চান। এখানে ageString এর মান "25 years" রূপে থাকতে পারে, যেটি থেকে শুধুমাত্র সংখ্যাটি বের করে নিতে হবে।
Person.java (DTO):
public class PersonDTO {
private String name;
private String ageString;
// Getters and Setters
}
PersonEntity.java (Entity/Domain Object):
public class PersonEntity {
private String name;
private int age;
// Getters and Setters
}
এখন, MapStruct এর মাধ্যমে এই ম্যাপিংটি করতে, আপনি expression অ্যাট্রিবিউট ব্যবহার করতে পারেন যা স্ট্রিং থেকে ইন্টিজার কনভার্ট করবে।
PersonMapper.java:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(source = "ageString", target = "age",
expression = "java(Integer.parseInt(person.getAgeString().replaceAll(\"\\D+\", \"\")))")
PersonEntity personDTOToPersonEntity(PersonDTO person);
}
এখানে, ageString ফিল্ডের স্ট্রিং মান থেকে সকল অক্ষর (non-digit characters) মুছে ফেলা হয়েছে এবং শুধুমাত্র সংখ্যা ব্যবহার করে Integer তে কনভার্ট করা হয়েছে। এটি expression অ্যাট্রিবিউটের মাধ্যমে কাস্টম কোড হিসেবে সম্পন্ন হয়েছে।
২. Date Formatting Mapping using expression
ধরা যাক, আপনি একটি Date অবজেক্টকে একটি String ফরম্যাটে ম্যাপ করতে চান। এর জন্য @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করতে পারেন।
উদাহরণ: Date থেকে String এ কনভার্ট করা
PersonDTO.java:
import java.util.Date;
public class PersonDTO {
private String name;
private Date birthDate;
// Getters and Setters
}
PersonEntity.java:
public class PersonEntity {
private String name;
private String birthDate;
// Getters and Setters
}
এখন, আপনি birthDate কে একটি String ফরম্যাটে ম্যাপ করতে পারেন, যেমন "dd-MM-yyyy"।
PersonMapper.java:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.text.SimpleDateFormat;
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(source = "birthDate", target = "birthDate",
expression = "java(new SimpleDateFormat(\"dd-MM-yyyy\").format(person.getBirthDate()))")
PersonEntity personDTOToPersonEntity(PersonDTO person);
}
এখানে, birthDate (যা Date টাইপের) কে একটি String টাইপে কনভার্ট করা হয়েছে "dd-MM-yyyy" ফরম্যাটে। SimpleDateFormat ব্যবহার করে এই কনভার্টশনটি সম্পন্ন করা হয়েছে।
৩. Using expression for Complex Object Mapping
যদি আপনার ম্যাপিংয়ে কিছু জটিল লজিক বা কাস্টম অবজেক্টের মান প্রক্রিয়াজাত করতে হয়, তবে আপনি expression অ্যাট্রিবিউটের মাধ্যমে জটিল ম্যাপিং লজিক প্রয়োগ করতে পারেন।
উদাহরণ: Complex Object Mapping with expression
ধরা যাক, একটি AddressDTO অবজেক্ট আছে এবং তার মধ্যে street এবং city প্রপার্টি রয়েছে, এবং আপনি এগুলি একটি fullAddress স্ট্রিংয়ে যুক্ত করতে চান।
AddressDTO.java:
public class AddressDTO {
private String street;
private String city;
// Getters and Setters
}
AddressEntity.java:
public class AddressEntity {
private String fullAddress;
// Getters and Setters
}
এখন, MapStruct এর মাধ্যমে আপনি street এবং city ফিল্ডগুলোকে একত্রিত করে fullAddress তৈরি করতে পারেন।
AddressMapper.java:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface AddressMapper {
AddressMapper INSTANCE = Mappers.getMapper(AddressMapper.class);
@Mapping(source = "street", target = "fullAddress",
expression = "java(address.getStreet() + \", \" + address.getCity())")
AddressEntity addressDTOToAddressEntity(AddressDTO address);
}
এখানে, expression অ্যাট্রিবিউট ব্যবহার করে street এবং city কে যুক্ত করে একটি fullAddress স্ট্রিং তৈরি করা হয়েছে।
৪. Custom Logic with expression
MapStruct এর expression অ্যাট্রিবিউট ব্যবহার করে আপনি সহজেই কাস্টম লজিক যুক্ত করতে পারেন। এটি বিশেষত তখন ব্যবহৃত হয় যখন ডিফল্ট ম্যাপিংয়ের বাইরে কিছু কাস্টম অপারেশন করতে হয়। আপনি এতে সহজেই জাভা এক্সপ্রেশন ব্যবহার করতে পারেন, যেমন গাণিতিক অপারেশন, স্ট্রিং ফরম্যাটিং, বা কাস্টম কনভার্সন।
উদাহরণ: String থেকে Enum Mapping
public enum Status {
ACTIVE,
INACTIVE
}
public class PersonDTO {
private String statusString;
// Getters and Setters
}
public class PersonEntity {
private Status status;
// Getters and Setters
}
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(source = "statusString", target = "status",
expression = "java(Status.valueOf(person.getStatusString().toUpperCase()))")
PersonEntity personDTOToPersonEntity(PersonDTO person);
}
এখানে, statusString (যেমন "active" বা "inactive") থেকে Enum টাইপ Status এ কনভার্ট করার জন্য expression ব্যবহার করা হয়েছে।
সারাংশ
MapStruct এর @Mapping অ্যানোটেশনের expression অ্যাট্রিবিউট ব্যবহার করে আপনি খুব সহজেই কাস্টম ম্যাপিং লজিক এবং কনভার্সন প্রয়োগ করতে পারেন। আপনি এতে জাভা এক্সপ্রেশন ব্যবহার করে প্রপার্টি মান কনভার্ট, ফরম্যাট বা কাস্টম লজিক প্রয়োগ করতে পারবেন, যা আপনাকে ম্যাপিংয়ের জন্য আরও বেশি কাস্টমাইজেশন এবং নমনীয়তা প্রদান করে। এটি ডোমেইন অবজেক্ট থেকে DTO অথবা অন্যান্য অবজেক্টে ডেটা ট্রান্সফার করার প্রক্রিয়াকে আরও কার্যকর এবং উন্নত করে তোলে।
MapStruct একটি শক্তিশালী টুল যা অটোমেটিক্যালি JavaBeans বা ডোমেইন অবজেক্টগুলির মধ্যে ম্যাপিং করে। কখনও কখনও, আপনি একটি custom mapping প্রক্রিয়া তৈরি করতে চাইবেন যেখানে MapStruct এর স্বয়ংক্রিয় ম্যাপিং লজিক যথেষ্ট নয়। এর জন্য আপনি Method Reference ব্যবহার করে Custom Mapping তৈরি করতে পারেন।
Method Reference ব্যবহার করার মাধ্যমে আপনি MapStruct এর ইনবিল্ট ম্যাপিং লজিকের সাথে কাস্টম লজিক যোগ করতে পারেন। এতে আপনি আপনার মডেল ম্যাপিং-এর জন্য কাস্টম কনভার্সন লজিক তৈরি করতে সক্ষম হবেন।
এটি সাধারণত ব্যবহার হয় যখন আপনাকে ডেটার ফরম্যাট বা ধরন কাস্টম কনভার্ট করতে হয়, যেমন একটি String থেকে Date বা Enum থেকে String এর কনভার্সন।
১. Method Reference এর মাধ্যমে Custom Mapping কী?
Method Reference হল Java 8 এর একটি বৈশিষ্ট্য যা কোন একটি মেথডকে রেফারেন্স করার মাধ্যমে সরাসরি ব্যবহার করার সুযোগ দেয়। MapStruct তে, আমরা এই বৈশিষ্ট্যটি ব্যবহার করতে পারি কাস্টম ম্যাপিং যুক্ত করার জন্য। বিশেষ করে যদি কোন কাস্টম কনভার্সন লজিক বা ডেটা প্রসেসিং করতে হয়, তখন Method Reference ব্যবহার করে তা সহজে যুক্ত করা যায়।
২. Method Reference ব্যবহার করে Custom Mapping তৈরি করা
ধরা যাক, আপনি একটি Employee ক্লাস থেকে EmployeeDTO ক্লাসে ডেটা ম্যাপ করতে চান, তবে কিছু ফিল্ডের জন্য আপনাকে কাস্টম কনভার্সন লজিক প্রয়োগ করতে হবে। যেমন, name এর আগে একটি স্যালুট (prefix) যোগ করা।
২.১ Employee এবং EmployeeDTO ক্লাস
Employee.java (Domain Object):
public class Employee {
private String name;
private String department;
// Getters and Setters
}
EmployeeDTO.java (DTO Object):
public class EmployeeDTO {
private String fullName;
private String department;
// Getters and Setters
}
২.২ Custom Mapping Method
এখন, আমরা একটি method reference ব্যবহার করে Employee থেকে EmployeeDTO তে ম্যাপিং করতে পারি, যেখানে name ফিল্ডে স্যালুট যোগ করা হবে।
EmployeeMapper.java (Mapper Interface):
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface EmployeeMapper {
EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);
// Custom Mapping Method
@Mapping(source = "name", target = "fullName", qualifiedByName = "addSalutation")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
// Custom Method to add salutation to the name
default String addSalutation(String name) {
return "Mr./Ms. " + name;
}
}
এখানে:
addSalutationএকটি কাস্টম মেথড যা Employee এর name ফিল্ডে "Mr./Ms." স্যালুট যোগ করে।- qualifiedByName ব্যবহার করা হয়েছে, যাতে MapStruct জানে কোন মেথড ব্যবহার করতে হবে।
২.৩ Usage Example
এখন, EmployeeMapper ব্যবহার করে Employee অবজেক্টকে EmployeeDTO তে ম্যাপ করতে হবে:
Main.java (Usage):
public class Main {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("John Doe");
employee.setDepartment("Engineering");
// Perform Mapping
EmployeeDTO employeeDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(employee);
System.out.println("Full Name: " + employeeDTO.getFullName());
System.out.println("Department: " + employeeDTO.getDepartment());
}
}
এখানে, employeeToEmployeeDTO মেথডটি addSalutation কাস্টম মেথড ব্যবহার করে Employee এর name ফিল্ডের সাথে স্যালুট যোগ করবে এবং EmployeeDTO তে সেটি ম্যাপ করবে।
আউটপুট:
Full Name: Mr./Ms. John Doe
Department: Engineering
৩. Method Reference ব্যবহার করে Complex Data Type Mapping
MapStruct এ Method Reference ব্যবহার করার আরেকটি উদাহরণ হলো যখন আপনি complex data types যেমন String থেকে Date বা Enum থেকে String কনভার্ট করতে চান। MapStruct আপনাকে এই কাস্টম কনভার্টারের জন্য qualifiedByName ব্যবহার করতে দেয়।
৩.১ String to Date Mapping Example
ধরা যাক, আপনাকে String ফরম্যাটে থাকা একটি তারিখকে Date অবজেক্টে কনভার্ট করতে হবে:
import java.text.SimpleDateFormat;
import java.util.Date;
public class CustomMapper {
// Custom method to convert String to Date
public static Date stringToDate(String dateStr) throws Exception {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
return formatter.parse(dateStr);
}
}
এখন, MapStruct এ এই কাস্টম কনভার্টার ব্যবহার করার জন্য:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface EmployeeMapper {
EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);
@Mapping(source = "dateOfBirth", target = "dob", qualifiedByName = "stringToDate")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
// Custom method to convert String to Date
default Date stringToDate(String dateStr) throws Exception {
return CustomMapper.stringToDate(dateStr);
}
}
এখানে, stringToDate কাস্টম মেথডটি Employee এর dateOfBirth ফিল্ডকে Date ফরম্যাটে কনভার্ট করে।
৪. MapStruct এ Method Reference এর সুবিধা
- Clean and Reusable Code: MapStruct এর মাধ্যমে Method Reference ব্যবহার করলে কাস্টম কনভার্টারগুলো পরিষ্কার এবং পুনরায় ব্যবহারযোগ্য হয়।
- Compile-time Safety: Method Reference ব্যবহার করলে আপনি compile-time এ টাইপ চেকিং করতে পারবেন, যা রানটাইমের ত্রুটির সম্ভাবনা কমায়।
- Flexibility: Complex কনভার্সন বা কাস্টম লজিক প্রয়োগ করতে Method Reference খুবই কার্যকরী, যা MapStruct এর ডিফল্ট মেপিং লজিকের বাইরে যেতে সাহায্য করে।
সারাংশ
Method Reference ব্যবহার করে MapStruct এ কাস্টম ম্যাপিং এবং কনভার্সন করার মাধ্যমে আপনি আপনার ডেটার মান এবং কাস্টম লজিক প্রক্রিয়া সম্পাদন করতে পারেন। এটি বিশেষভাবে প্রয়োজনীয় যখন আপনাকে String থেকে Date, Enum থেকে String, বা complex objects এর মধ্যে কনভার্ট করতে হয়। Method Reference এর মাধ্যমে আপনি সহজে এবং কার্যকরীভাবে কাস্টম ম্যাপিংয়ের সুবিধা পেতে পারেন।
MapStruct একটি শক্তিশালী মডেল মেপিং ফ্রেমওয়ার্ক যা ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং সহজ করে তোলে। তবে কখনও কখনও ডিফল্ট ম্যাপিং কনভার্শনগুলি পর্যাপ্ত হয় না এবং কিছু কাস্টম কনভার্শন বা এক্সপ্রেশন প্রয়োজন হয়। MapStruct এই কাস্টম কনভার্শন এবং ম্যাপিংয়ের জন্য Expression এবং Method Reference সমর্থন করে।
এখানে আমরা দেখব কিভাবে MapStruct ব্যবহার করে Expression এবং Method Reference ব্যবহার করে কাস্টম কনভার্শন সম্পন্ন করা যায়।
১. MapStruct Expression ব্যবহার
Expression ব্যবহার করে আপনি ম্যাপিং কনভার্শনের জন্য Java Expression প্রদান করতে পারেন। এটি আপনাকে ডোমেইন অবজেক্টের ফিল্ড ভ্যালু কাস্টমভাবে কনভার্ট করতে সাহায্য করে।
উদাহরণ: Expression ব্যবহার করে কাস্টম ম্যাপিং
ধরা যাক, আমাদের একটি Person ক্লাস এবং একটি PersonDTO ক্লাস রয়েছে। আমরা চাই যে Person ক্লাসের fullName ফিল্ডের মধ্যে firstName এবং lastName যুক্ত করে PersonDTO এর fullName ফিল্ডে সেট করা হোক। এটি Expression ব্যবহার করে করা সম্ভব।
Person.java (Domain Object)
public class Person {
private String firstName;
private String lastName;
// Getters and Setters
}
PersonDTO.java (DTO)
public class PersonDTO {
private String fullName;
// Getters and Setters
}
PersonMapper.java (MapStruct Mapper)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
@Mapping(target = "fullName", expression = "java(person.getFirstName() + \" \" + person.getLastName())")
PersonDTO personToPersonDTO(Person person);
}
এখানে, expression ট্যাগের মধ্যে একটি Java Expression দেওয়া হয়েছে, যা firstName এবং lastName থেকে fullName তৈরি করবে।
PersonMapper Usage
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
System.out.println(personDTO.getFullName()); // Output: John Doe
}
}
এখানে PersonMapper ইন্টারফেস expression ব্যবহার করে firstName এবং lastName ফিল্ডে সংযুক্ত করে fullName তৈরি করছে।
২. MapStruct Method Reference ব্যবহার
Method Reference MapStruct এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনাকে ম্যাপিংয়ের জন্য একটি existing method ব্যবহার করতে সহায়তা করে। এটি Java 8 এর একটি ফিচার যা কোডের পুনঃব্যবহারযোগ্যতা এবং পরিষ্কারতা উন্নত করে।
উদাহরণ: Method Reference ব্যবহার করে কাস্টম ম্যাপিং
ধরা যাক, আমাদের একটি Person ক্লাস রয়েছে এবং আমরা এটি PersonDTO তে ম্যাপ করতে চাই, তবে firstName এবং lastName এর মধ্যে যোগফল হিসেব করতে হবে। আমরা একটি এক্সটার্নাল মেথড ব্যবহার করব যা fullName তৈরি করবে।
Person.java (Domain Object)
public class Person {
private String firstName;
private String lastName;
// Getters and Setters
}
PersonDTO.java (DTO)
public class PersonDTO {
private String fullName;
// Getters and Setters
}
PersonMapper.java (MapStruct Mapper)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
@Mapping(target = "fullName", source = "person", qualifiedByName = "mapFullName")
PersonDTO personToPersonDTO(Person person);
// Method Reference for custom conversion
default String mapFullName(Person person) {
return person.getFirstName() + " " + person.getLastName();
}
}
এখানে, mapFullName মেথডটি Person ক্লাসের firstName এবং lastName ফিল্ডকে fullName এ কনভার্ট করে। মেপিংয়ের জন্য আমরা qualifiedByName ব্যবহার করছি, যা mapFullName মেথডকে নির্দেশ করে।
PersonMapper Usage
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
System.out.println(personDTO.getFullName()); // Output: John Doe
}
}
এখানে, PersonMapper ইন্টারফেস mapFullName মেথড রেফারেন্স ব্যবহার করে firstName এবং lastName এর মান যোগ করে fullName তৈরি করছে।
৩. Expression এবং Method Reference এর পার্থক্য
- Expression:
- আপনি সরাসরি একটি Java Expression প্রদান করেন।
- এটি সাধারণত ম্যাপিংয়ের মধ্যে কাস্টম লজিক প্রয়োগ করতে ব্যবহৃত হয়।
- Expression লাইনটি খুবই স্পষ্ট এবং স্বল্প হয়ে থাকে।
- Method Reference:
- এখানে আপনি একটি বিদ্যমান মেথড রেফারেন্স ব্যবহার করেন।
- এটি কোডের পুনঃব্যবহারযোগ্যতা বাড়ায় এবং আপনি কোনো কাস্টম লজিক প্রয়োগ করতে পারেন যা অন্য কোথাও আগে লেখা হয়ে থাকতে পারে।
- Method Reference সাধারণত আপনার কোডে পুনরায় একই লজিক ব্যবহার করার সুবিধা দেয়।
সারাংশ
MapStruct এর মাধ্যমে Expression এবং Method Reference ব্যবহার করে আপনি কাস্টম কনভার্শন বা ম্যাপিং প্রক্রিয়া পরিচালনা করতে পারেন। Expression ব্যবহার করে আপনি সরাসরি কাস্টম কোড প্রয়োগ করতে পারেন, যেখানে Method Reference ব্যবহার করে একটি বিদ্যমান মেথড রেফারেন্স করতে পারেন যা ম্যাপিং প্রক্রিয়াকে সহজতর করে। এগুলি MapStruct এর শক্তিশালী বৈশিষ্ট্য, যা ডোমেইন অবজেক্টের মধ্যে কাস্টম কনভার্শন প্রয়োগ করতে সহায়ক।
Read more