بِسْـــــــــمِ ﷲِالرَّحْمَنِ الرَّحِيم. اَللَّهُمَّ صَلِّى عَلَى مُحَمَّدٍٍ، وَعَلَى آلِهِ مُحَمَّدٍٍ


Hari ini Tedi mencuba satu pustaka pemetaan objek dalam Java bernama Mapstruct.

Memandangkan Tedi perlu gunakan JDK 7 maka Mapstruct versi 1.2.0 Final dipilih kerana versi terkini tidak menyokong JDK 7.

Rujukan penggunaan ada di https://mapstruct.org/documentation/1.2/reference/html/#introduction.

 

Salah satu masalah yang ditemui semasa deployment ke dalam server Glassfish versi 3.1.2.2 ialah:

Severe: Exception while loading the app : WELD-001408 Unsatisfied dependencies for type [CpamMapper] with qualifiers [@Default] at injection point [[field] @Inject private cmm.service.CmmService.cpamMapper]

Rupa-rupanya kalau nak refer mapper gunakan annotation @Inject kena gunakan componentModel = "cdi" pada @Mapper. Lain pula jika gunakan Spring dan lain-lain, semuanya ada dalam rujukan.

@Mapper(componentModel = "jssr330")
public interface CpamMapper {
  ...
}

Tetapi masih tak menjadi. Tedi ada terbaca orang kata dia add dependency ke mapstruct-processor, Tedi dah tension Tedi pun try lah, walaupun tiada dalam dokumen.

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>

<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>

Eh menjadi pula, barulah kelas implementation generated dalam folder : \target\generated-sources\annotations\cpam\mapper (tertakluk kepada nama pakej anda).

Okaylah, Tedi nak test run sistem ni dulu nanti apa-apa Tedi update.


Memetakan antara 2 List

Alhamdulillah Tedi telah berjaya menggunakan Mapstruct ini dengan jayanya, dan alangkah bertuahnya kerana pustaka ini juga mengambil kita pemetaan list atau collection.

Memandangkan tiada nota seperti yang Tedi harapkan, maka Tedi persembahkan apa yang telah Tedi buat:

 package cpam.mapper;  
 import cmm.entities.CmmAddress;  
 import cpam.entities.CpmBranch;  
 import java.util.List;  
 import org.mapstruct.Mapper;  
 import org.mapstruct.Mapping;  
 import org.mapstruct.Mappings;  
 @Mapper(componentModel = "jsr330")  
 public interface CpamMapper {  
   @Mappings({  
     @Mapping(source = "caId", target = "branchId"),  
     @Mapping(source = "caCompanyName", target = "branchname"),  
     @Mapping(source = "caAddress1", target = "address1"),  
     @Mapping(source = "caAddress2", target = "address2"),  
     @Mapping(source = "caAddress3", target = "address3"),  
     @Mapping(source = "caCity", target = "city"),  
     @Mapping(source = "caPostcode", target = "postcode"),  
     @Mapping(source = "caState", target = "state"),  
     @Mapping(source = "caCountry", target = "country"),  
     @Mapping(source = "caPhoneNo", target = "phone"),  
     @Mapping(source = "caFaxNo", target = "fax")  
   })  
   CpmBranch cmmAddressToCpmBranch(CmmAddress cmmAddress);  
   List<CpmBranch> cmmAddressesToCpmBranches(List<CmmAddress> cmmAddresses);  
 }  

Kalau dalam contoh tiada ditunjukkan bagaimana kita nak set @Mapping untuk list, tetapi Tedi telah main cuba jaya tadi dan berjaya, kita kena sediakan mapper untuk object ke object beserta @Mappings jika kita nak customize mapping. Kemudian kita cuma perlu define mapper untuk list pula tanpa perlukan sebarang @Mappings kerana nanti ia akan rujuk kepada mapper object ke object yang telah kita define.

Alhamdulillah berbaloi dapat ilmu baru yang sesuai untuk Tedi yang malas nak menaip kod ini. Hihihihi.


Sekarang Tedi terlibat dalam pemisahan schema database ke beberapa server berlainan di mana kami perkenalkan beberapa sambungan database yang baru. Jadi kami perlu juga memisahkan SQL yang joined di antara beberapa schema. Oleh itu pemetaan memainkan peranan penting kerana kami perlu selaraskan field di antara beberapa table atau view yang sudah tentu berbeza susunan dan nama. Penatlah kalau nak taip kod manual. Betul tak?


~20220407~
jika kiriman ini bermanfaat, tolong lawat iklan yang ada ya, terima kasih