MapStruct একটি শক্তিশালী টুল যা ডোমেইন অবজেক্ট এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে দ্রুত এবং কার্যকরী ম্যাপিং প্রদান করে। তবে কখনও কখনও ম্যাপিং কোডে সমস্যা দেখা দিতে পারে, বিশেষ করে কাস্টম ম্যাপিং এবং ট্রান্সিটিভ ডিপেনডেন্সি ব্যবহারের সময়। এই ধরনের সমস্যাগুলি শনাক্ত করতে এবং সমাধান করতে MapStruct Debugging এবং Logging অত্যন্ত গুরুত্বপূর্ণ।
এই গাইডে, আমরা MapStruct Debugging এবং Logging এর মাধ্যমে কিভাবে আপনার ম্যাপিং প্রক্রিয়া মনিটর করতে পারেন, এবং সমস্যা সমাধান করতে সাহায্য করতে পারে তা আলোচনা করব।
MapStruct Debugging ব্যবহার করার মাধ্যমে আপনি আপনার ম্যাপিং কোডের কার্যকারিতা এবং ভুল শনাক্ত করতে পারেন। MapStruct সাধারণত compile-time এ কোড জেনারেট করে, তবে যদি কোনো সমস্যা থাকে যেমন কাস্টম ম্যাপিং বা ট্রান্সিটিভ ডিপেনডেন্সি সমস্যার কারণে, তখন debugging প্রয়োজন।
MapStruct এর debugging সক্ষম করতে, আপনাকে Maven বা Gradle এর মাধ্যমে কম্পাইল টাইমে MapStruct এর গenerated কোড দেখতে হবে।
Maven ব্যবহার করলে, MapStruct এর debugging সক্ষম করতে আপনার pom.xml ফাইলে নিচের কমান্ডের মাধ্যমে debugging সক্ষম করতে পারেন।
mvn clean install -X
এখানে, -X ফ্ল্যাগের মাধ্যমে Maven debug মোডে চলে যাবে এবং MapStruct এর জেনারেটেড কোড সম্পর্কিত বিস্তারিত তথ্য দেখাবে।
Gradle ব্যবহার করলে, আপনি --debug ফ্ল্যাগ দিয়ে debugging চালু করতে পারেন।
gradle build --debug
এটি Gradle বিল্ড প্রক্রিয়ায় অতিরিক্ত তথ্য দেখাবে, যার মাধ্যমে আপনি MapStruct এর জেনারেটেড কোড এবং ম্যাপিং সম্পর্কিত বিস্তারিত তথ্য পেতে পারবেন।
MapStruct কোড জেনারেশন সম্পর্কিত কোনো সমস্যা চিহ্নিত করতে Log ব্যবহার করতে পারেন। MapStruct এর মাধ্যমে log messages প্রিন্ট করা যায়, যা আপনাকে debugging সহজ করবে।
MapStruct স্বাভাবিকভাবে খুব বেশি লগ মেসেজ জেনারেট করে না, তবে আপনি ম্যানুয়ালি কিছু Log Level কনফিগার করতে পারেন।
logback.xml ফাইলের মাধ্যমে লগ লেভেল কনফিগার করতে পারেন:
<configuration>
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="Console"/>
</root>
</configuration>
এখানে Log Level debug
এ সেট করা হয়েছে, যা MapStruct এর debugging আউটপুট দেখাবে।
আপনি MapStruct এর কোড জেনারেটর এবং ম্যাপিং ফাংশনগুলির কার্যকলাপ ট্র্যাক করতে লগ তৈরি করতে পারেন। উদাহরণস্বরূপ:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyMapper {
private static final Logger logger = LoggerFactory.getLogger(MyMapper.class);
public Destination map(Source source) {
logger.debug("Mapping source: {}", source);
// Perform mapping logic
return destination;
}
}
এখানে, debug
লগ লেভেলে ম্যাপিং সম্পর্কিত তথ্য বা অবস্থা দেখানো হচ্ছে।
ধরা যাক, আমাদের দুটি ক্লাস Employee এবং EmployeeDTO রয়েছে এবং আমরা MapStruct ব্যবহার করে এগুলির মধ্যে ডেটা ম্যাপ করতে চাই। আমরা দেখব কিভাবে debugging এবং logging এর মাধ্যমে ম্যাপিং সম্পর্কিত সমস্যাগুলি চিহ্নিত করা যায়।
public class Employee {
private String name;
private int age;
// Getters and Setters
}
public class EmployeeDTO {
private String name;
private String ageCategory;
// Getters and Setters
}
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Mapper
public interface EmployeeMapper {
Logger logger = LoggerFactory.getLogger(EmployeeMapper.class);
@Mapping(source = "age", target = "ageCategory", defaultValue = "Unknown")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
default String mapAge(int age) {
logger.debug("Mapping age: {}", age);
if (age > 50) {
return "Senior";
} else if (age >= 18) {
return "Adult";
} else {
return "Minor";
}
}
}
এখানে, mapAge মেথডে debugging ব্যবহার করা হয়েছে, যাতে age মানটি লজিকের মাধ্যমে কিভাবে পরিবর্তিত হচ্ছে তা লগ আউটপুটে দেখানো হয়। যখন EmployeeMapper ব্যবহার করা হবে, mapAge মেথডের মধ্যে আর্গুমেন্ট হিসাবে age পাঠানো হবে এবং এর মান লগ আউটপুটে প্রদর্শিত হবে।
public class Main {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("John");
employee.setAge(45);
EmployeeDTO employeeDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(employee);
System.out.println("Employee DTO: " + employeeDTO.getName() + ", " + employeeDTO.getAgeCategory());
}
}
এখানে, mapAge মেথডে বয়সের ক্যাটাগরি "Senior" বা "Adult" বা "Minor" হিসেবে ম্যাপ হবে এবং এই পরিবর্তনটি debugging এর মাধ্যমে লগ আউটপুটে দেখা যাবে।
MapStruct Debugging এবং Logging মাভেন বা গ্র্যাডল প্রোজেক্টে ম্যাপিং সমস্যাগুলির দ্রুত সমাধান করতে সাহায্য করে। MapStruct এর debugging সক্ষম করে আপনি MapStruct এর কোড জেনারেশন প্রক্রিয়া মনিটর করতে পারেন এবং ম্যাপিং সম্পর্কিত ত্রুটিগুলি সহজেই চিহ্নিত করতে পারবেন। এছাড়া, logging এর মাধ্যমে ম্যাপিং সম্পর্কিত লজিক এবং কার্যকলাপ সম্পর্কে ধারণা পাওয়া যায়, যা ডেভেলপারদের জন্য গুরুত্বপূর্ণ তথ্য সরবরাহ করে।
MapStruct একটি জনপ্রিয় Java annotation processor যা compile-time এ কোড জেনারেট করে এবং ডোমেইন অবজেক্ট থেকে DTO (Data Transfer Object) বা অন্য কোন অবজেক্টে ম্যাপিং প্রক্রিয়া সরল করে। MapStruct এর মাধ্যমে আপনি অটোমেটিক ম্যাপিং কোড জেনারেট করতে পারেন, তবে কখনও কখনও ম্যাপিং কোডের মধ্যে ত্রুটি বা ভুল হতে পারে, এবং তখন debugging প্রক্রিয়া প্রয়োজন হয়।
এই টিউটোরিয়ালে, আমরা MapStruct এর ম্যাপিং ফাংশন বা কোড জেনারেট করা প্রক্রিয়ায় কোনো সমস্যা চিহ্নিত করতে এবং সমাধান করতে কিছু debugging কৌশল আলোচনা করব।
MapStruct ব্যবহারের সময় বেশ কিছু সাধারণ সমস্যা হতে পারে, যেমন:
MapStruct কোড জেনারেটর প্রক্রিয়া compile-time এ কাজ করে, তাই এটি ডিবাগ করার জন্য কিছু নির্দিষ্ট কৌশল রয়েছে।
MapStruct কোড জেনারেট করার সময় আপনি Maven বিল্ডের debugging মোড চালু করতে পারেন, যাতে আপনি ম্যাপিং প্রক্রিয়ার সময় কোন ত্রুটি বা কোড জেনারেট না হওয়া সম্পর্কিত তথ্য দেখতে পারেন।
mvn clean install -X
এখানে, -X
ফ্ল্যাগ ব্যবহার করলে Maven আপনাকে বিস্তারিত ডিবাগ আউটপুট দেখাবে, যেখানে MapStruct এর কোড জেনারেটিং প্রসেসের সময় কোনো সমস্যা থাকলে তা সহজেই চিহ্নিত করা যায়।
IntelliJ IDEA এবং Eclipse তে MapStruct এর annotation processor কার্যক্রম ডিবাগ করতে পারেন। এটি করার জন্য আপনাকে IDE তে annotation processing সক্রিয় করতে হবে।
IntelliJ IDEA:
Eclipse:
এটি আপনার কোডের অ্যানোটেশন প্রসেসরের আউটপুট সরাসরি দেখতে সাহায্য করবে।
MapStruct compile-time এ কোড জেনারেট করে, তাই আপনি আপনার জেনারেটেড কোড পরীক্ষা করতে পারেন। Maven বা Gradle বিল্ডের পর, MapStruct জেনারেট করা কোড target/generated-sources/annotations ফোল্ডারে বা build/generated/sources/annotations ফোল্ডারে পাওয়া যাবে। এই কোডে যদি কোনো ত্রুটি বা সমস্যা থাকে, তবে আপনি এটি পর্যালোচনা করতে পারবেন।
@Mapping
and @MappingTarget
to DebugMapStruct এর @Mapping
এবং @MappingTarget
অ্যানোটেশন ব্যবহার করে আপনি ম্যাপিং প্রক্রিয়ায় সমস্যা চিহ্নিত করতে পারেন। এখানে কিছু debugging টিপস দেওয়া হলো:
@Mapping
অ্যানোটেশন ব্যবহার করে source এবং target ফিল্ডগুলির মান নির্ধারণ করুন।@MappingTarget
অ্যানোটেশন ব্যবহার করে আপনি লক্ষ্য অবজেক্টে পরিবর্তনগুলির পরিস্থিতি চেক করতে পারেন।@Mapper
public interface PersonMapper {
@Mapping(source = "name", target = "fullName") // Ensure the field names match
@Mapping(target = "age", defaultValue = "25") // Provide default values
PersonDTO personToPersonDTO(Person person);
}
এখানে, @Mapping
ব্যবহার করে আপনি ফিল্ড মেলানোর জন্য সঠিক মান সরবরাহ করতে পারেন, যা ডিবাগিং প্রক্রিয়া সহজ করে।
আপনি MapStruct এর ম্যাপিং কোডের মধ্যে লগ স্টেটমেন্ট যোগ করে ডিবাগ করতে পারেন। এতে আপনাকে বিস্তারিত দেখতে সাহায্য করবে কোন ফিল্ড কিভাবে ম্যাপ হচ্ছে বা কোথায় সমস্যা হচ্ছে।
@Mapper(componentModel = "spring")
public interface EmployeeMapper {
@Mapping(source = "name", target = "fullName")
@Mapping(source = "department", target = "dept")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
default String mapDepartment(String department) {
System.out.println("Mapping department: " + department);
return department != null ? department : "Default Department";
}
}
এখানে, mapDepartment মেথডে একটি লগ স্টেটমেন্ট যোগ করা হয়েছে যাতে department ফিল্ডটির মান ট্র্যাক করা যায়।
Problem: যখন MapStruct ম্যাপিং কোড তৈরি করতে ব্যর্থ হয়, তখন এটি "mapping not found" ত্রুটি দেখাতে পারে।
Solution: নিশ্চিত করুন যে:
Problem: কখনও কখনও ডোমেইন অবজেক্ট এবং DTO এর মধ্যে টাইপ মেলানো না হলে type mismatch ত্রুটি দেখা দেয়।
Solution:
আপনি @Mapping অ্যানোটেশন ব্যবহার করে টাইপ কনভার্সন সরবরাহ করতে পারেন। যেমন:
@Mapping(source = "birthDate", target = "dob", dateFormat = "dd-MM-yyyy")
Problem: আপনি যখন null ভ্যালু ম্যাপিং করছেন, তখন NullPointerException হতে পারে।
Solution: @Mapping অ্যানোটেশনে nullValuePropertyMappingStrategy কনফিগার করুন, যা null ভ্যালু ম্যাপিংয়ের সময় নিরাপত্তা প্রদান করে।
@Mapper
public interface EmployeeMapper {
@Mapping(source = "birthDate", target = "dob", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.SET_TO_NULL)
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, nullValuePropertyMappingStrategy ব্যবহার করে আপনি null ভ্যালু পরিচালনা করতে পারবেন।
@AfterMapping
for Post Mapping LogicMapStruct আপনাকে @AfterMapping
অ্যানোটেশন ব্যবহার করার সুবিধা দেয়, যেখানে আপনি ম্যাপিং প্রক্রিয়া শেষ হওয়ার পর কোনো অতিরিক্ত লজিক প্রয়োগ করতে পারেন। এটি ডিবাগিংয়ের জন্য উপকারী হতে পারে।
@Mapper
public interface EmployeeMapper {
@Mapping(source = "birthDate", target = "dob")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
@AfterMapping
default void afterMapping(Employee employee, @MappingTarget EmployeeDTO employeeDTO) {
if (employee.getDepartment() == null) {
employeeDTO.setDepartment("Default Department");
}
}
}
এখানে, afterMapping মেথডে আপনি EmployeeDTO তে অতিরিক্ত লজিক প্রয়োগ করতে পারেন।
MapStruct এ ডিবাগিং কৌশল ব্যবহার করে আপনি ম্যাপিং প্রক্রিয়ায় সঠিকভাবে সমস্যা চিহ্নিত করতে এবং সমাধান করতে পারেন। Maven বিল্ডের debugging মোড ব্যবহার, IDE তে annotation processor চালু করা, জেনারেটেড কোড পরীক্ষা করা, এবং কাস্টম ম্যাপিং মেথড ব্যবহার করা MapStruct ডিবাগ করার বেশ কিছু কার্যকরী কৌশল। এসব কৌশল ব্যবহার করে আপনি আপনার MapStruct ম্যাপিং কোডের কার্যকারিতা নিশ্চিত করতে এবং সমস্যা চিহ্নিত করতে সহায়তা পাবেন।
MapStruct একটি annotation processor ভিত্তিক Java লাইব্রেরি, যা ডোমেইন অবজেক্ট এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং কোড অটোমেটিকভাবে জেনারেট করে। MapStruct compile-time এ কোড জেনারেট করে, এবং এর ফলে আপনি runtime reflection এর উপর নির্ভর না করে দ্রুত পারফরম্যান্স পেতে পারেন। তবে, মাঝে মাঝে আপনাকে Generated Mapping কোড দেখতে এবং যাচাই (verify) করতে হতে পারে, যাতে ম্যাপিং সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করা যায়।
এখানে, আমরা MapStruct এর মাধ্যমে জেনারেট হওয়া কোড দেখতে এবং যাচাই করার পদ্ধতি সম্পর্কে আলোচনা করব।
MapStruct compile-time এ ম্যাপিং কোড জেনারেট করে, যা সাধারণত target/generated-sources/annotations ডিরেক্টরিতে সঞ্চিত হয়। MapStruct কোনো runtime reflection ব্যবহার না করে, বরং একটি implementation ক্লাস তৈরি করে যা মূল Mapper Interface এর বাস্তবায়ন হিসেবে কাজ করে।
ধরা যাক, আপনার Person এবং PersonDTO ক্লাস দুটি আছে এবং আপনি এগুলির মধ্যে ম্যাপিং করতে চান।
Person.java (Domain Object):
public class Person {
private String name;
private int age;
// Getters and Setters
}
PersonDTO.java (DTO):
public class PersonDTO {
private String name;
private int age;
// Getters and Setters
}
PersonMapper.java (Mapper Interface):
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
এখানে, PersonMapper ইন্টারফেসের মাধ্যমে Person থেকে PersonDTO তে ম্যাপিং করা হচ্ছে।
এখন, MapStruct এই ম্যাপিং ইন্টারফেসটির জন্য কোড জেনারেট করবে। এটি সাধারণত একটি PersonMapperImpl ক্লাস তৈরি করবে যা Person থেকে PersonDTO তে ম্যাপিং করার জন্য বাস্তবায়ন সরবরাহ করবে।
এই generated code দেখতে, আপনার Maven বা Gradle প্রকল্পে target/generated-sources/annotations
ফোল্ডারটি চেক করুন।
public class PersonMapperImpl implements PersonMapper {
@Override
public PersonDTO personToPersonDTO(Person person) {
if ( person == null ) {
return null;
}
PersonDTO personDTO = new PersonDTO();
personDTO.setName( person.getName() );
personDTO.setAge( person.getAge() );
return personDTO;
}
}
এখানে, PersonMapperImpl ক্লাসটি personToPersonDTO মেথডের বাস্তবায়ন প্রদান করেছে, যা Person অবজেক্ট থেকে PersonDTO তে ম্যাপিং করবে।
MapStruct কোড জেনারেট করার পরে, আপনাকে নিশ্চিত করতে হবে যে জেনারেটেড কোড সঠিকভাবে কাজ করছে। এটি unit testing এর মাধ্যমে করা যায়।
আপনি JUnit টেস্ট কেস ব্যবহার করে MapStruct এর জেনারেটেড কোডের কার্যকারিতা যাচাই করতে পারেন।
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class PersonMapperTest {
@Test
public void testPersonToPersonDTO() {
// Given
Person person = new Person();
person.setName("John");
person.setAge(30);
// When
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
// Then
assertEquals("John", personDTO.getName());
assertEquals(30, personDTO.getAge());
}
}
এখানে, testPersonToPersonDTO() টেস্ট মেথডটি নিশ্চিত করবে যে Person থেকে PersonDTO তে ম্যাপিং সঠিকভাবে হচ্ছে কিনা।
এখানে PersonMapperImpl ক্লাসটি পাবেন, যা MapStruct এর মাধ্যমে জেনারেট করা হয়।
যদি আপনি জেনারেটেড কোডে কোনো সমস্যা পান, তবে নীচের বিষয়গুলো যাচাই করতে পারেন:
MapStruct একটি শক্তিশালী টুল যা compile-time এ কোড জেনারেট করে, যাতে পারফরম্যান্সে উন্নতি হয়। Generated Mapping Code দেখতে এবং যাচাই (verify) করতে হলে আপনি target/generated-sources/annotations ফোল্ডারটি ব্যবহার করতে পারেন। JUnit টেস্ট কেস ব্যবহার করে এই কোডের কার্যকারিতা নিশ্চিত করা যায়, এবং এটি আপনার মডেল ম্যাপিংকে নির্ভরযোগ্য এবং সঠিকভাবে কাজ করতে সহায়তা করে।
এছাড়া, MapStruct এর জেনারেটেড কোডের মাধ্যমে nested objects, collections, এবং custom type conversions সহজেই করা সম্ভব, যা আপনি আপনার প্রোজেক্টে সঠিকভাবে প্রয়োগ করতে পারেন।
MapStruct হল একটি Java ফ্রেমওয়ার্ক যা মূলত অ্যানোটেশন ব্যবহার করে ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং করতে ব্যবহৃত হয়। এটি কোড জেনারেট করে এবং compile-time এ ম্যাপিং বাস্তবায়ন করে, যা পারফরম্যান্সের জন্য অনেক বেশি উপকারী। যদিও MapStruct এর মাধ্যমে ম্যাপিং কনফিগার করা এবং ব্যবহৃত হয়, তবে ডিবাগিং এবং উন্নত লগিং সুবিধা পাওয়ার জন্য MapStruct Logging কনফিগারেশন করা যেতে পারে।
MapStruct এর লগিং কনফিগারেশন সাধারণত SLF4J (Simple Logging Facade for Java) বা Log4j এর মাধ্যমে করা হয়। আপনি MapStruct এর মাধ্যমে বিভিন্ন ধরনের ম্যাপিং এক্সিকিউশন ট্র্যাক করতে পারবেন এবং এর কার্যকারিতা মনিটর করতে পারেন।
এখানে আমরা MapStruct Logging কনফিগার করার জন্য প্রয়োজনীয় পদক্ষেপ এবং কনফিগারেশন উদাহরণ দেখব।
MapStruct এর সাথে লগিং কনফিগারেশন আপনার ম্যাপিং অপারেশন এবং কোড জেনারেশন প্রক্রিয়া মনিটর করার জন্য সহায়ক হতে পারে। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনি ডেভেলপমেন্টে সমস্যাগুলি দ্রুত সনাক্ত করতে চান। সাধারণত, MapStruct SLF4J অথবা Log4j লগিং ফ্রেমওয়ার্কের মাধ্যমে লগিং সাপোর্ট প্রদান করে।
MapStruct এর মাধ্যমে ম্যাপিং প্রক্রিয়া সম্পাদন করার সময়, আপনি লগ মেসেজগুলির স্তর (INFO, DEBUG, ERROR) কাস্টমাইজ করে ট্র্যাক করতে পারেন।
SLF4J হল একটি সাধারণ লগিং ফ্যাসেড যা বিভিন্ন লগিং লাইব্রেরির সাথে কাজ করতে পারে। এর মাধ্যমে MapStruct এর ম্যাপিং অপারেশনগুলির লগ করা সহজ হয়।
প্রথমে, pom.xml ফাইলে SLF4J এবং Logback এর জন্য ডিপেনডেন্সি যোগ করতে হবে।
<dependencies>
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version>
</dependency>
<!-- Logback for logging -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.6</version>
</dependency>
<!-- MapStruct Dependency -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.2.Final</version>
</dependency>
<!-- MapStruct Processor -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.2.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
এখানে Logback হল SLF4J এর একটি বাস্তবায়ন যা কনসোল এবং ফাইল আউটপুট সহ লগিং করতে সক্ষম।
logback.xml
):MapStruct এর লগিং কনফিগার করার জন্য, Logback এর মাধ্যমে লগ আউটপুট কনফিগার করতে পারেন। নিচে একটি উদাহরণ দেওয়া হলো।
<configuration>
<!-- Console Appender: logs to the console -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- Root Logger: Sets the logging level and appender -->
<root level="info">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
এখানে:
MapStruct ইন্টারফেসের মাধ্যমে আপনার ম্যাপিং কোডে লগ মেসেজ অন্তর্ভুক্ত করতে পারেন। উদাহরণস্বরূপ:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Mapper
public interface PersonMapper {
Logger logger = LoggerFactory.getLogger(PersonMapper.class);
@Mapping(source = "name", target = "fullName")
PersonDTO personToPersonDTO(Person person);
default PersonDTO mapPerson(Person person) {
logger.debug("Mapping Person object to PersonDTO object: {}", person);
PersonDTO personDTO = personToPersonDTO(person);
logger.info("Mapping completed successfully");
return personDTO;
}
}
এখানে, SLF4J Logger ব্যবহার করা হয়েছে, যাতে mapPerson
মেথডের মাধ্যমে Person অবজেক্টের ম্যাপিং প্রক্রিয়া লগ করা হয়।
যদি আপনি MapStruct এর মাধ্যমে কাস্টম ম্যাপিং বা কনভার্সন করতে চান, তবে আপনি নিজে কাস্টম কনভার্সন লজিক এবং লগিং যুক্ত করতে পারেন।
ধরা যাক, আপনি String থেকে Date এ কাস্টম কনভার্সন করতে চান এবং তার সাথে লগ মেসেজ যুক্ত করতে চান। নিচে একটি উদাহরণ দেওয়া হলো:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.text.SimpleDateFormat;
import java.util.Date;
@Mapper
public interface DateMapper {
Logger logger = LoggerFactory.getLogger(DateMapper.class);
@Mapping(source = "dateString", target = "formattedDate")
default Date mapStringToDate(String dateString) {
logger.debug("Converting String to Date: {}", dateString);
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(dateString);
logger.info("Successfully converted String to Date");
return date;
} catch (Exception e) {
logger.error("Error converting String to Date", e);
return null;
}
}
}
এখানে, কাস্টম কনভার্টার mapStringToDate মেথডে String থেকে Date কনভার্সন করা হয়েছে এবং লোগিং কনফিগার করা হয়েছে।
MapStruct এর মাধ্যমে আপনি DEBUG, INFO, ERROR লগ স্তরের কাস্টমাইজেশন করতে পারেন, যা আপনি প্রজেক্টের প্রয়োজন অনুযায়ী ব্যবহার করতে পারেন।
logger.debug("Starting to map the Person object: {}", person);
logger.info("Mapping completed successfully");
logger.error("An error occurred while mapping");
MapStruct Logging কনফিগারেশন আপনার ম্যাপিং প্রক্রিয়া মনিটর করতে এবং সমস্যা চিহ্নিত করতে সহায়ক। SLF4J বা Logback ব্যবহার করে আপনি আপনার ম্যাপিং কার্যক্রম এবং কনভার্সন প্রক্রিয়ার লোগিং সিস্টেম কাস্টমাইজ করতে পারেন। এর মাধ্যমে, আপনি DEBUG, INFO, ERROR স্তরে বিভিন্ন ম্যাপিং স্টেটমেন্ট বা ত্রুটি ট্র্যাক করতে পারবেন, যা ডেভেলপমেন্টে দ্রুত সমস্যা সমাধান এবং উন্নতি করতে সহায়তা করবে।
MapStruct একটি শক্তিশালী এবং দক্ষ Java টুল যা ডোমেইন অবজেক্টের মধ্যে ডেটা ম্যাপিং সহজ করে তোলে। যদিও এটি কোড জেনারেশন প্রযুক্তি ব্যবহার করে, এর মাধ্যমে বিভিন্ন সমস্যা বা ত্রুটি দেখা দিতে পারে। তাই debugging এবং logging MapStruct ব্যবহারের গুরুত্বপূর্ণ অংশ হয়ে দাঁড়ায়, কারণ এটি আপনাকে ম্যাপিংয়ের মধ্যে সমস্যা চিহ্নিত করতে সহায়তা করে।
এই টিউটোরিয়ালে, আমরা MapStruct ব্যবহার করার সময় debugging এবং logging কিভাবে কার্যকরীভাবে করতে হবে, তা নিয়ে আলোচনা করব।
MapStruct নিজেই একটি annotation processor যা কোড জেনারেট করে, তবে কখনো কখনো ম্যাপিংয়ে কোনো সমস্যা বা ত্রুটি দেখা দিতে পারে, যেমন টাইপ মিসম্যাচ, ডোমেইন অবজেক্টের ফিল্ড না মিলানো ইত্যাদি। তাই আপনাকে কিভাবে MapStruct কোড এবং ম্যাপিং সমস্যা debug করতে হয় তা জানা জরুরি।
Logging MapStruct এর মধ্যে ম্যাপিংয়ের সমস্যা শনাক্ত করতে একটি গুরুত্বপূর্ণ হাতিয়ার। সাধারণত, MapStruct নিজে থেকে লগিং সরবরাহ করে না, তবে আপনি আপনার মডেল ম্যাপিংয়ের জন্য custom logging যুক্ত করতে পারেন।
MapStruct ব্যবহার করার সময় লগিং কনফিগারেশন করতে হলে আপনাকে কিছু কাস্টম কোডিং এবং টুলস ব্যবহার করতে হবে।
ধরা যাক, আপনি Person ডোমেইন অবজেক্ট এবং PersonDTO ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং করছেন এবং এই ম্যাপিংয়ের জন্য logging যোগ করতে চান। এটি MapStruct দ্বারা করা যাবে, কিন্তু Logger ব্যবহার করে।
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Mapper(componentModel = "spring")
public interface PersonMapper {
Logger logger = LoggerFactory.getLogger(PersonMapper.class);
@Mapping(source = "fullName", target = "name")
PersonDTO personToPersonDTO(Person person);
default PersonDTO personToPersonDTOWithLogging(Person person) {
logger.info("Mapping Person: {} to PersonDTO", person.getFullName());
PersonDTO dto = personToPersonDTO(person);
logger.info("Mapped PersonDTO: {}", dto.getName());
return dto;
}
}
এখানে, আমরা slf4j এর মাধ্যমে logger তৈরি করেছি এবং default method ব্যবহার করে লগিং মেসেজটি জেনারেট করেছি, যা ম্যাপিংয়ের আগে এবং পরে লগ করবে।
যদি আপনি Spring ব্যবহার করেন, তাহলে MapStruct ম্যাপিং ব্যবহারের সময় আপনার Spring logging কনফিগারেশন সঙ্গে চলে আসবে, এবং তা আপনার মডেল ম্যাপিংয়ের জন্য লগিং সক্রিয় করবে।
MapStruct কোড জেনারেট করে, তাই কোডটির মধ্যে সমস্যা সনাক্ত করতে generated code দেখতে সাহায্য করতে পারে। MapStruct জেনারেট করা কোডের মধ্যে সমস্যাটি চিহ্নিত করা সহজ হয়ে ওঠে।
MapStruct দ্বারা জেনারেট করা কোড সাধারণত নিচের মতো দেখাবে:
public class PersonMapperImpl implements PersonMapper {
@Override
public PersonDTO personToPersonDTO(Person person) {
if (person == null) {
return null;
}
PersonDTO personDTO = new PersonDTO();
personDTO.setName(person.getFullName()); // Example of field mapping
return personDTO;
}
}
এখানে, আপনি দেখতে পাবেন যে MapStruct কোড সঠিকভাবে প্রতিটি ফিল্ড ম্যাপিং করছে এবং এটি কীভাবে কাজ করছে।
MapStruct কোডে লগিং যুক্ত করতে, আপনি উপরোক্ত logging উদাহরণটি ব্যবহার করতে পারেন এবং ম্যাপিংয়ের পুরো প্রক্রিয়া ট্র্যাক করতে পারবেন।
source
এবং target
ফিল্ডের নাম বা টাইপ ম্যাচ না করে, তবে MapStruct কোড জেনারেট করবে না।@Mapping
অ্যানোটেশন দিয়ে nullValueCheckStrategy কনফিগার করুন।MapStruct Debugging এবং Logging হল গুরুত্বপূর্ণ কৌশল যা ম্যাপিংয়ের মধ্যে সমস্যা শনাক্ত করতে সাহায্য করে। MapStruct দ্বারা জেনারেট করা কোড এবং logging এর মাধ্যমে, আপনি আপনার কোডের কার্যকারিতা এবং ত্রুটিগুলি দ্রুত চিহ্নিত করতে পারবেন। SLF4J এবং Logback এর মাধ্যমে লগিং কনফিগার করা যায়, যা আপনাকে ম্যাপিং প্রক্রিয়া ট্র্যাক করতে এবং debug করতে সহায়তা করবে।
Read more