JavaRush /Java Blog /Random-TK /“Mapstruct” näme we “SpringBoot” programmalarynda birlik ...

“Mapstruct” näme we “SpringBoot” programmalarynda birlik synagy üçin nädip sazlamaly

Toparda çap edildi

Düşündiriş

Hemmelere salam, gadyrly dostlarym we okyjylarym! Makalany ýazmazdan ozal, azajyk fon ... recentlyakynda bu ýerdäki telegram kanalymda gysgaça beýan eden Mapstruct kitaphanasy bilen işlemekde bir kynçylyk bilen ýüzbe-ýüz boldum . Teswirlerde ýazgy bilen baglanyşykly mesele çözüldi; öňki taslamadaky kärdeşim muňa kömek etdi. Şondan soň bu mowzukda makala ýazmak kararyna geldim, ýöne elbetde dar garamarys we ilki bilen tizlige ýetmäge synanyşarys, Mapstructyň nämedigini we näme üçin zerurdygyny düşüneris we hakyky mysal ulanarys öň ýüze çykan ýagdaýy we ony nädip çözmelidigini derňäň. Şonuň üçin hemme hasaplamalary iş ýüzünde başdan geçirmek üçin makalany okamak bilen paralel etmegi maslahat berýärin. Başlamazdan ozal, telegram kanalymy ýazyň , men ol ýerdäki işlerimi ýygnaýaryn, Java we umuman IT-de ösüş hakda pikirler ýazýaryn. Abuna ýazyldy? Gowy! Bolýar, indi gideli! “Mapstruct” näme we “SpringBoot” programmalarynda birlik synagy üçin nädip sazlamaly.  1-nji bölüm

Mapstruct, fak?

Çalt görnüşli howpsuz noýba kartalary üçin kod generatory. Ilkinji wezipämiz “Mapstruct” -yň nämedigini we näme üçin bize mätäçdigini anyklamakdyr. Umuman, bu hakda resmi web sahypasynda okap bilersiňiz. Sahypanyň baş sahypasynda soraglara üç jogap bar: bu näme? Näme üçin? Nädip? Muny hem etmäge synanyşarys:

Bu näme?

“Mapstruct” käbir obýektleriň obýektlerini karta (karta, karta we ş.m.) kartalaşdyrmaga kömek edýän kitaphanadyr, interfeýsler arkaly beýan edilýän konfigurasiýalara esaslanan döredilen kody ulanyp, käbir subýektleriň obýektlerini beýleki guramalaryň obýektlerine öwürýär.

Näme üçin?

Köplenç köp gatlakly programmalary döredýäris (maglumat bazasy bilen işlemek üçin bir gatlak, iş logikasynyň bir gatlagy, programmanyň daşarky dünýä bilen gatnaşygy üçin gatlak) we her gatlagyň maglumatlary saklamak we gaýtadan işlemek üçin öz obýektleri bar. . Bu maglumatlary bir guramadan beýlekisine geçirmek arkaly gatlakdan gatlaga geçirmeli. Bu çemeleşme bilen işlemedikler üçin bu birneme çylşyrymly bolup görünýär. Mysal üçin, Talyplar bazasy üçin bir guramamyz bar. Bu guramanyň maglumatlary biznes logikasy (hyzmatlar) gatlagyna geçende, maglumatlary Talyplar synpyndan StudentModel synpyna geçirmeli. Ondan soň, iş logikasy bilen ähli manipulýasiýalardan soň, maglumatlary daşarda çykarmaly. Munuň üçin “StudentDto” synpymyz bar. Elbetde, “StudentModel” synpyndan “StudentDto” -a maglumatlary geçirmeli. Her gezek geçiriljek usullar el bilen ýazmak köp zähmet talap edýär. Üstesine, bu saklanmaly kod bazasyndaky goşmaça kod. Aalňyşlyk goýberip bilersiňiz. “Mapstruct” şeýle usullary düzmek tapgyrynda döredýär we olary döredilen çeşmelerde saklaýar.

Nädip?

Annotasiýalary ulanmak. Diňe kitaphanada bu interfeýsdäki usullaryň bir obýektden beýlekisine terjime edilip bilinjekdigini aýdýan esasy Mapper düşündirişi bolan düşündiriş döretmeli. Talyplar hakda öňem aýdyşym ýaly, biziň ýagdaýymyzda bu maglumatlary bir gatlakdan beýlekisine geçirmegiň birnäçe usuly bolan StudentMapper interfeýsi bolar:
public class Student {
   private Long id;
   private String firstName;
   private String lastName;
   private Integer age;
}

public class StudentDTO {
   private Long id;
   private String firstName;
   private String lastName;
   private Integer age;
}

public class StudentModel {
   private Long id;
   private String firstName;
   private String lastName;
   private Integer age;
}
Bu synplar üçin karta ýasaýarys (mundan beýläk geçirmek isleýän zadymyzy we nirä düşündirýän interfeýs diýeris):
@Mapper
public interface StudentMapper {
   StudentModel toModel(StudentDTO dto);
   Student toEntity(StudentModel model);
   StudentModel toModel(Student entity);
   StudentDTO toDto(StudentModel model);
}
Bu çemeleşmäniň gözelligi, meýdanlaryň atlary we görnüşleri dürli synplarda birmeňzeş bolsa (biziň ýagdaýymyzdaky ýaly), “Mapstruct” -yň sazlamalary düzmek tapgyrynda “StudentMapper” interfeýsine esaslanýan zerur ýerine ýetirişleri döretmek üçin ýeterlikdir. terjime eder. Onda eýýäm düşnükli boldy, şeýlemi? Geliň, “Bahar boot” programmasyndaky işi derňemek üçin hakyky mysal ulanalyň.

“Bahar boot” we “Mapstruct” -yň işleýşine mysal

Ilki bilen bize “Bahar boot” taslamasyny döretmek we oňa “Mapstruct” goşmak gerek. Bu meselede, GitHub-da ammarlar üçin galyplar bolan bir guramam bar we “Spring Boot” -yň başlangyjy şolaryň biridir. Şundan ugur alyp, täze taslama döredýäris: Indiki taslamany“Mapstruct” näme we “SpringBoot” programmalarynda birlik synagy üçin nädip sazlamaly.  1-nji bölüm alarys . Hawa, dostlar, peýdaly diýip hasap eden bolsaňyz, taslama ýyldyz beriň , şonuň üçin muny biderek etmeýändigimi bilerin. Bu taslamada, işde alan we Telegram kanalymdaky ýazgyda beýan eden ýagdaýymyzy aýan ederis . Bilmeýänler üçin ýagdaýy gysgaça beýan ederin: kartalar üçin synaglar ýazanymyzda (ýagny, öň aýdyp geçen interfeýs amallary üçin) synaglaryň mümkin boldugyça çalt geçmegini isleýäris. Mappers bilen iň ýönekeý wariant, synag geçirilende “SpringBootTest” düşündirişini ulanmakdyr, bu bolsa “Bahar Boot” programmasynyň “ApplicationContext” -ini alar we synagyň içinde synag üçin zerur kartany sanar. Emma bu wariant köp serişde talap edýär we has köp wagt alýar, şonuň üçin bu biziň üçin amatly däl. Diňe islenýän kartany döredýän we usullarynyň garaşyşymyz ýaly işleýändigini barlaýan birlik synagyny ýazmalydyrys. Has çalt işlemek üçin näme üçin synaglar gerek? Synaglar köp wagt alsa, ähli ösüş prosesini haýalladýar. Synaglar täze kody geçýänçä, bu kody dogry hasaplap bolmaz we synag üçin kabul edilmez, bu önümçilige alynmajakdygyny we işläp düzüjiniň işini tamamlamandygyny aňladýar. Görnüşinden, näme üçin amaly şübhesiz kitaphana üçin synag ýazmaly? Şeýle-de bolsa, synag ýazmalydyrys, sebäbi kartany nädip dogry suratlandyrandygymyzy we garaşýan zadymyzy ýerine ýetirýändigini barlaýarys. Ilki bilen, işimizi aňsatlaşdyrmak üçin, pom.xml-e başga bir garaşlylyk goşup, taslamamyza Lombok goşalyň:
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <scope>provided</scope>
</dependency>
Taslamamyzda, daşarky dünýä bilen aragatnaşyk saklamak üçin ulanýan model synplarymyzdan (biznes logikasy bilen işlemek üçin ulanylýar) DTO synplaryna geçmeli bolarys. Simplönekeýleşdirilen wersiýamyzda meýdanlar üýtgemeýär we kartalarymyz ýönekeý bolar diýip çaklaýarys. Emma, ​​isleg bar bolsa, “Mapstruct” bilen nädip işlemelidigi, ony nädip sazlamalydygy we peýdalaryndan nädip peýdalanmalydygy barada has jikme-jik makala ýazmak mümkin bolardy. Emma, ​​bu makala gaty uzyn bolar. Geliň, gatnaşýan leksiýalaryň we lektorlaryň sanawy bolan bir okuwçymyz bar diýeliň. Geliň, nusga bukjasyny döredeliň . Şundan ugur alyp, ýönekeý bir model dörederis:
package com.github.romankh3.templaterepository.springboot.dto;

import lombok.Data;

import java.util.List;

@Data
public class StudentDTO {

   private Long id;

   private String name;

   private List<LectureDTO> lectures;

   private List<LecturerDTO> lecturers;
}
leksiýalary
package com.github.romankh3.templaterepository.springboot.dto;

import lombok.Data;

@Data
public class LectureDTO {

   private Long id;

   private String name;
}
we lektorlar
package com.github.romankh3.templaterepository.springboot.dto;

import lombok.Data;

@Data
public class LecturerDTO {

   private Long id;

   private String name;
}
Model paketiniň gapdalynda dto paket dörediň :
package com.github.romankh3.templaterepository.springboot.dto;

import lombok.Data;

import java.util.List;

@Data
public class StudentDTO {

   private Long id;

   private String name;

   private List<LectureDTO> lectures;

   private List<LecturerDTO> lecturers;
}
leksiýalar
package com.github.romankh3.templaterepository.springboot.dto;

import lombok.Data;

@Data
public class LectureDTO {

   private Long id;

   private String name;
}
we lektorlar
package com.github.romankh3.templaterepository.springboot.dto;

import lombok.Data;

@Data
public class LecturerDTO {

   private Long id;

   private String name;
}
Indi leksiýa modelleriniň ýygyndysyny DTO leksiýalarynyň ýygyndysyna terjime etjek karta ýasalyň. Ilki bilen taslama Mapstruct goşmak. Munuň üçin olaryň resmi web sahypasyny ulanarys , hemme zat şol ýerde beýan edilýär. .Agny, ýadymyza bir garaşlylyk we bir plugin goşmalydyrys (ýadyň nämedigi barada soraglaryňyz bar bolsa, şu ýere gidiň, 1-nji madda we 2-nji madda ):
<dependency>
   <groupId>org.mapstruct</groupId>
   <artifactId>mapstruct</artifactId>
   <version>1.4.2.Final</version>
</dependency>
we <build /> blokda ýatda. entek ýok:
<build>
   <plugins>
       <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-compiler-plugin</artifactId>
           <version>3.5.1</version>
           <configuration>
               <source>1.8</source>
               <target>1.8</target>
               <annotationProcessorPaths>
                   <path>
                       <groupId>org.mapstruct</groupId>
                       <artifactId>mapstruct-processor</artifactId>
                       <version>1.4.2.Final</version>
                   </path>
               </annotationProcessorPaths>
           </configuration>
       </plugin>
   </plugins>
</build>
Indiki, dto we modeliň gapdalynda mapper paketini döredeliň . Öň görkezen sapaklarymyza esaslanyp, ýene bäş sany karta döretmeli bolarsyňyz:
  • Mapper leksiýa modeli <-> leksiýaDTO
  • Mapper sanawy <LectureModel> <-> Sanaw <LectureDTO>
  • Mapper MugallymModel <-> MugallymDTO
  • Mapper sanawy <LektorModel> <-> Sanaw <LektorDTO>
  • Mapper StudentModel <-> StudentDTO
Git:

LeksiýaMapper

package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.dto.LecturerDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
public interface LectureMapper {
   LectureDTO toDTO(LectureModel model);

   LectureModel toModel(LecturerDTO dto);
}

Leksiýa sanawy

package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import org.mapstruct.Mapper;

import java.util.List;

@Mapper(componentModel = "spring", uses = LectureMapper.class)
public interface LectureListMapper {
   List<LectureModel> toModelList(List<LectureDTO> dtos);
   List<LectureDTO> toDTOList(List<LectureModel> models);
}

Mugallym

package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring")
public interface LectureMapper {
   LectureDTO toDTO(LectureModel model);

   LectureModel toModel(LectureDTO dto);
}

Mugallymlar sanawy

package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LecturerDTO;
import com.github.romankh3.templaterepository.springboot.model.LecturerModel;
import org.mapstruct.Mapper;

import java.util.List;

@Mapper(componentModel = "spring", uses = LecturerMapper.class)
public interface LecturerListMapper {
   List<LecturerModel> toModelList(List<LecturerDTO> dloList);
   List<LecturerDTO> toDTOList(List<LecturerModel> modelList);
}

StudentMapper

package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.StudentDTO;
import com.github.romankh3.templaterepository.springboot.model.StudentModel;
import org.mapstruct.Mapper;

@Mapper(componentModel = "spring", uses = {LectureListMapper.class, LecturerListMapper.class})
public interface StudentMapper {
   StudentDTO toDTO(StudentModel model);
   StudentModel toModel(StudentDTO dto);
}
Kartalarda beýleki kartaçylara ýüzlenýändigimizi aýratyn bellemelidiris. Bu , StudentMapper-de bolşy ýaly, Mapper düşündirişindäki ulanyş meýdançasy arkaly amala aşyrylýar :
@Mapper(componentModel = "spring", uses = {LectureListMapper.class, LecturerListMapper.class})
Bu ýerde leksiýalaryň sanawyny we lektorlaryň sanawyny dogry kartalaşdyrmak üçin iki karta ulanýarys. Indi kodumyzy düzmeli we nämäniň bardygyny we nädip bolmalydygyny görmeli. Muny mvn arassa kompile buýrugy ulanyp edip bolýar . , Öne, belli bolşy ýaly, kartalarymyzyň Mapstruct ýerine ýetirişleri döredilende, karta ýerine ýetirişleri meýdanlara ýazylmady. Näme üçin? Lombokdan Maglumatlaryň düşündirişini alyp bolmaýandygy ýüze çykdy. Bir zat edilmeli boldy ... Şonuň üçin makalada täze bölümimiz bar.

“Lombok” we “Mapstruct” -y baglanyşdyrmak

Birnäçe minut gözlegden soň, Lombok bilen Mapstruct-y belli bir derejede birikdirmelidigimiz ýüze çykdy. Mapstruct resminamalarynda bu barada maglumat bar . Mapstruct-dan döredijiler tarapyndan teklip edilen mysaly öwrenenimizden soň, pom.xml-i täzeläliň: Aýry-aýry wersiýalary goşalyň:
​​<properties>
   <org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
   <lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
</properties>
Missingitirilen garaşlylygy goşalyň:
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok-mapstruct-binding</artifactId>
   <version>${lombok-mapstruct-binding.version}</version>
</dependency>
“Lombok” we “Mapstruct” -y birleşdirip biler ýaly, düzüjimiziň pluginini täzeläliň:
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-compiler-plugin</artifactId>
   <version>3.5.1</version>
   <configuration>
       <source>1.8</source>
       <target>1.8</target>
       <annotationProcessorPaths>
           <path>
               <groupId>org.mapstruct</groupId>
               <artifactId>mapstruct-processor</artifactId>
               <version>${org.mapstruct.version}</version>
           </path>
           <path>
               <groupId>org.projectlombok</groupId>
               <artifactId>lombok</artifactId>
               <version>${lombok.version}</version>
           </path>
           <path>
               <groupId>org.projectlombok</groupId>
               <artifactId>lombok-mapstruct-binding</artifactId>
               <version>${lombok-mapstruct-binding.version}</version>
           </path>
       </annotationProcessorPaths>
   </configuration>
</plugin>
Ondan soň hemme zat netije bermeli. Geliň, taslamamyzy ýene bir gezek düzeliň. Mapöne Mapstructyň döreden sapaklaryny nireden tapyp bilersiňiz? Olar döredilen çeşmelerde: $ {projectDir} / maksat / döredilen-çeşmeler / düşündirişler / “Mapstruct” näme we “SpringBoot” programmalarynda birlik synagy üçin nädip sazlamaly.  1-nji bölüm Indi Mapstruct ýazgysyndan göwnüçökgünligimizi duýmaga taýyn bolanymyz üçin, kartalar üçin synaglary döretmäge synanyşalyň.

Kartalarymyz üçin synaglar ýazýarys

Integrasiýa synagyny döredýän ýagdaýymyzda kartalaryň birini synap görjek we gutarýan wagty barada alada etmejek çalt we ýönekeý synag dörederin:

LeksiýaMapperTest

package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class LectureMapperTest {

   @Autowired
   private LectureMapper mapperUnderTest;

   @Test
   void shouldProperlyMapModelToDto() {
       //given
       LectureModel model = new LectureModel();
       model.setId(11L);
       model.setName("lecture name");

       //when
       LectureDTO dto = mapperUnderTest.toDTO(model);

       //then
       Assertions.assertNotNull(dto);
       Assertions.assertEquals(model.getId(), dto.getId());
       Assertions.assertEquals(model.getName(), dto.getName());
   }

   @Test
   void shouldProperlyMapDtoToModel() {
       //given
       LectureDTO dto = new LectureDTO();
       dto.setId(11L);
       dto.setName("lecture name");

       //when
       LectureModel model = mapperUnderTest.toModel(dto);

       //then
       Assertions.assertNotNull(model);
       Assertions.assertEquals(dto.getId(), model.getId());
       Assertions.assertEquals(dto.getName(), model.getName());
   }
}
Bu ýerde, “SpringBootTest” düşündirişini ulanyp, “ApplicationContext” -iň hemmesini işe girizýäris we ondan “Awtomatiki düşündiriş” ulanyp, synag üçin zerur synpy çykarýarys. Synag ýazmagyň tizligi we aňsatlygy nukdaýnazaryndan bu gaty gowy. Synag üstünlikli geçýär, hemme zat gowy. Emma başga ýoldan gidip, kartaçy üçin birlik synagyny ýazarys, mysal üçin LectureListMapper ...
package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.List;

class LectureListMapperTest {

   private final LectureListMapper lectureListMapper = new LectureListMapperImpl();

   @Test
   void shouldProperlyMapListDtosToListModels() {
       //given
       LectureDTO dto = new LectureDTO();
       dto.setId(12L);
       dto.setName("I'm BATMAN!");

       List<LectureDTO> dtos = Collections.singletonList(dto);

       //when
       List<LectureModel> models = lectureListMapper.toModelList(dtos);

       //then
       Assertions.assertNotNull(models);
       Assertions.assertEquals(1, models.size());
       Assertions.assertEquals(dto.getId(), models.get(0).getId());
       Assertions.assertEquals(dto.getName(), models.get(0).getName());
   }
}
“Mapstruct” -yň döredýän amallary biziň taslamamyz bilen bir synpdadygy sebäpli, synaglarymyzda aňsatlyk bilen ulanyp bileris. Hemme zat ajaýyp görünýär - düşündiriş ýok, biz iň ýönekeý görnüşde zerur synpy döredýäris we hut şu. Theöne synagy geçirenimizde, onuň ýykyljakdygyna we konsolda NullPointerException boljakdygyna düşüneris ... Munuň sebäbi LectureListMapper kartasynyň ýerine ýetirilişiniň:
package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Generated(
   value = "org.mapstruct.ap.MappingProcessor",
   date = "2021-12-09T21:46:12+0300",
   comments = "version: 1.4.2.Final, compiler: javac, environment: Java 15.0.2 (N/A)"
)
@Component
public class LectureListMapperImpl implements LectureListMapper {

   @Autowired
   private LectureMapper lectureMapper;

   @Override
   public List<LectureModel> toModelList(List<LectureDTO> dtos) {
       if ( dtos == null ) {
           return null;
       }

       List<LectureModel> list = new ArrayList<LectureModel>( dtos.size() );
       for ( LectureDTO lectureDTO : dtos ) {
           list.add( lectureMapper.toModel( lectureDTO ) );
       }

       return list;
   }

   @Override
   public List<LectureDTO> toDTOList(List<LectureModel> models) {
       if ( models == null ) {
           return null;
       }

       List<LectureDTO> list = new ArrayList<LectureDTO>( models.size() );
       for ( LectureModel lectureModel : models ) {
           list.add( lectureMapper.toDTO( lectureModel ) );
       }

       return list;
   }
}
NPE-e seretsek (NullPointerException üçin gysga), başlamadyk bolup çykýan leksiýaMapper üýtgeýjisinden alarys. Implementationöne ýerine ýetirişimizde üýtgeýjini başlap biljek konstruktorymyz ýok. “Mapstruct” -yň kartany şeýle ýerine ýetirmeginiň hut şu sebäbi! Springaz paslynda, dürli usullar bilen sapaklara noýba goşup bilersiňiz, ýokarda görkezilişi ýaly, Awtomatiki düşündiriş bilen bir meýdana sanjyp bilersiňiz ýa-da konstruktor arkaly sanjyp bilersiňiz. Synag ýerine ýetiriş wagtyny optimizirlemeli bolanymda, işde şeýle kynçylykly ýagdaýa düşdüm. Bu hakda hiç zat edip bolmaz öýdüp, Telegram kanalymda agyrymy dökdüm. Soň bolsa teswirlerde maňa kömek etdiler we sanjym strategiýasyny düzüp boljakdygyny aýtdylar. “Mapper” interfeýsinde diňe iki sany gymmaty bolan “ InjectionStrategiýa ” adyny kabul edýän “InjectionStrategiýa ” meýdançasy bar: SÖELGI we Gurluşykçy . Indi muny bilip, geliň, bu sazlamany kartalarymyza goşalyň; mysal hökmünde LectureListMapper ulanyp görkezerin :
@Mapper(componentModel = "spring", uses = LectureMapper.class, injectionStrategy = InjectionStrategy.CONSTRUCTOR)
public interface LectureListMapper {
   List<LectureModel> toModelList(List<LectureDTO> dtos);
   List<LectureDTO> toDTOList(List<LectureModel> models);
}
Goşan bölümimi goýy bilen belledim. Geliň, beýlekiler üçin bu opsiýany goşalyň we kartalaryň täze setir bilen döredilmegi üçin taslamany täzeden düzeliň. Bu zatlar ýerine ýetirilenden soň, “LectureListMapper” -iň kartasynyň ýerine ýetirilişiniň nähili üýtgändigini göreliň (bize gerek bolan bölegini goýy bilen görkezilýär):
package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Generated(
   value = "org.mapstruct.ap.MappingProcessor",
   date = "2021-12-09T22:25:37+0300",
   comments = "version: 1.4.2.Final, compiler: javac, environment: Java 15.0.2 (N/A)"
)
@Component
public class LectureListMapperImpl implements LectureListMapper {

   private final LectureMapper lectureMapper;

   @Autowired
   public LectureListMapperImpl(LectureMapper lectureMapper) {

       this.lectureMapper = lectureMapper;
   }

   @Override
   public List<LectureModel> toModelList(List<LectureDTO> dtos) {
       if ( dtos == null ) {
           return null;
       }

       List<LectureModel> list = new ArrayList<LectureModel>( dtos.size() );
       for ( LectureDTO lectureDTO : dtos ) {
           list.add( lectureMapper.toModel( lectureDTO ) );
       }

       return list;
   }

   @Override
   public List<LectureDTO> toDTOList(List<LectureModel> models) {
       if ( models == null ) {
           return null;
       }

       List<LectureDTO> list = new ArrayList<LectureDTO>( models.size() );
       for ( LectureModel lectureModel : models ) {
           list.add( lectureMapper.toDTO( lectureModel ) );
       }

       return list;
   }
}
Indi “Mapstruct” konstruktoryň üsti bilen mapper sanjymyny amala aşyrdy. Bu edil biziň gazanjak bolýan zadymyz. Indi synagymyz ýygnamagy bes eder, geliň täzeläliň we alalyň:
package com.github.romankh3.templaterepository.springboot.mapper;

import com.github.romankh3.templaterepository.springboot.dto.LectureDTO;
import com.github.romankh3.templaterepository.springboot.model.LectureModel;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Collections;
import java.util.List;

class LectureListMapperTest {

   private final LectureListMapper lectureListMapper = new LectureListMapperImpl(new LectureMapperImpl());

   @Test
   void shouldProperlyMapListDtosToListModels() {
       //given
       LectureDTO dto = new LectureDTO();
       dto.setId(12L);
       dto.setName("I'm BATMAN!");

       List<LectureDTO> dtos = Collections.singletonList(dto);

       //when
       List<LectureModel> models = lectureListMapper.toModelList(dtos);

       //then
       Assertions.assertNotNull(models);
       Assertions.assertEquals(1, models.size());
       Assertions.assertEquals(dto.getId(), models.get(0).getId());
       Assertions.assertEquals(dto.getName(), models.get(0).getName());
   }
}
Indi synagdan geçsek, hemme zat garaşylşy ýaly işlär, sebäbi LectureListMapperImpl-de zerur LectureMapper-den geçýäris ... oryeňiş! Bu siziň üçin kyn däl, ýöne göwnüme degdi: Dostlar, hemme zat hemişeki ýaly, GitHub hasabyma , Telegram hasabyma ýazylyň . Şol ýerde işimiň netijelerini ýerleşdirýärin, hakykatdanam peýdaly zatlar bar) Men sizi telegram kanalynyň diskussiýa toparyna goşulmaga çagyrýaryn . Kimdir biriniň tehniki soragy bar bolsa, ol ýerde jogap alyp biler. Bu format hemmeler üçin gyzykly, kimiň nämäni bilýändigini we tejribe toplap bilersiňiz.

Netije

Bu makalanyň bir bölegi hökmünde Mapstruct ýaly zerur we ýygy-ýygydan ulanylýan önüm bilen tanyşdyk. Munuň nämedigini, näme üçin we nädip bolandygyny bildik. Hakyky mysal ulanyp, näme edilip bilinjekdigini we nädip üýtgedilip bilinjekdigini duýduk. Şeýle hem kartalary dogry barlamak üçin noýba sanjymyny konstruktoryň üsti bilen nädip sazlamalydygyna göz aýladyk. “Mapstruct” -yň kärdeşleri önümlerini ulanyjylara kartalary nädip sanjym etmelidigini anyk saýlamaga mümkinçilik berdiler, şonuň üçin olara şübhesiz minnetdarlyk bildirýäris. Springöne, Baharyň konstruktoryň üsti bilen noýba sanjym etmegi maslahat berýändigine garamazdan, Mapstruct-dan ýigitler meýdan boýunça sanjymlary bellediler. Näme üçin beýle? Jogap ýok. Diňe bilmeýän sebäplerimiziň bolup biljekdigine ynanýaryn we şonuň üçinem şeýle etdiler. Olardan bilmek üçin, resmi önüm ammarynda GitHub meselesini döretdim.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION