Entitás DTO átalakításra egy tavaszi REST API-hoz

REST felső

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT

1. Áttekintés

Ebben az oktatóanyagban azokat a konverziókat kezeljük, amelyeknek meg kell történniük a Spring alkalmazás belső entitásai és a külső DTO-k között (Adatátviteli objektumok), amelyeket visszaadnak az ügyfélnek.

2. Mapper modell

Kezdjük azzal, hogy bemutatjuk a fő könyvtárat, amelyet használni fogunk az entitás-DTO konverzió végrehajtásához - ModelMapper.

Szükségünk lesz erre a függőségre a pom.xml:

 org.modelmapper modelmapper 2.3.5 

Itt ellenőrizheti, hogy van-e újabb verziója ennek a könyvtárnak.

Ezután meghatározzuk a ModelMapper bab tavaszi konfigurációnkban:

@Bean public ModelMapper modelMapper () {return new ModelMapper (); }

3. A DTO

Ezután mutassuk be ennek a kétoldalú problémának a DTO oldalát - Post DTO:

public class PostDto {private static final SimpleDateFormat dateFormat = new SimpleDateFormat ("éééé-HH-nn ÓÓ: mm"); magán hosszú azonosító; privát húr cím; privát karakterlánc URL; privát String dátum; privát UserDto felhasználó; public Date getSubmissionDateConverted (karakterlánc időzóna) dobja a ParseException {dateFormat.setTimeZone (TimeZone.getTimeZone (timezone)); return dateFormat.parse (this.date); } public void setSubmissionDate (dátum dátuma, karakterlánc időzóna) {dateFormat.setTimeZone (TimeZone.getTimeZone (timezone)); this.date = dateFormat.format (dátum); } // szokásos mérőeszközök és beállítók} 

Vegye figyelembe, hogy a két egyedi dátummal kapcsolatos módszer oda-vissza kezeli a dátumkonvertálást az ügyfél és a kiszolgáló között:

  • getSubmissionDateConverted () módszer konvertálja a dátumot Húr ba be Dátum a szerver időzónájában, hogy a fennmaradóban is használni lehessen Post entitás
  • setSubmissionDate () módszer a DTO dátumának beállítása Post’S Dátum az aktuális felhasználói időzónában.

4. A szolgáltatási réteg

Most nézzünk meg egy szolgáltatási szintű műveletet - amely nyilvánvalóan az Entity-vel (nem a DTO-val) fog működni:

public list getPostsList (int oldal, int méret, String sortDir, String sort) {PageRequest pageReq = PageRequest.of (oldal, méret, Sort.Direction.fromString (sortDir), rendezés); Oldalbejegyzések = postRepository .findByUser (userService.getCurrentUser (), pageReq); return posts.getContent (); }

Ezután megnézzük a szolgáltatás feletti réteget - a vezérlő réteget. Itt valósul meg a megtérés is.

5. A vezérlő réteg

Vessünk egy pillantást egy szabványos vezérlő megvalósításra, bemutatva az egyszerű REST API-t Post forrás.

Itt bemutatunk néhány egyszerű CRUD műveletet: létrehozás, frissítés, beszerzés és minden megszerzése. És mivel a műveletek meglehetősen egyszerűek, különösen az Entity-DTO konverzió szempontjai érdekelnek minket:

@Controller osztály PostRestController {@Autowired private IPostService postService; @Autowired private IUserService userService; @Autowired privát ModelMapper modelMapper; @GetMapping @ResponseBody public getPosts (...) {// ... List posts = postService.getPostsList (oldal, méret, sortDir, rendezés); return posts.stream () .map (this :: convertToDto) .collect (Collectors.toList ()); } @PostMapping @ResponseStatus (HttpStatus.CREATED) @ResponseBody nyilvános PostDto createPost (@RequestBody PostDto postDto) {Post post = convertToEntity (postDto); Post postCreated = postService.createPost (post)); return convertToDto (postCreated); } @GetMapping (value = "/ {id}") @ResponseBody public PostDto getPost (@PathVariable ("id") Long id) {return convertToDto (postService.getPostById (id)); } @PutMapping (value = "/ {id}") @ResponseStatus (HttpStatus.OK) public void updatePost (@RequestBody PostDto postDto) {Post post = convertToEntity (postDto); postService.updatePost (post); }}

És itt van től való megtérésünk Post entitás PostDto:

privát PostDto convertToDto (Post post) {PostDto postDto = modelMapper.map (post, PostDto.class); postDto.setSubmissionDate (post.getSubmissionDate (), userService.getCurrentUser (). getPreference (). getTimezone ()); return postDto; }

És itt van a megtérés a DTO-tól egy entitásig:

private Post convertToEntity (PostDto postDto) dobja a ParseException {Post post = modelMapper.map (postDto, Post.class); post.setSubmissionDate (postDto.getSubmissionDateConverted (userService.getCurrentUser (). getPreference (). getTimezone ())); if (postDto.getId ()! = null) {Régi post = postService.getPostById (postDto.getId ()); post.setRedditID (oldPost.getRedditID ()); post.setSent (oldPost.isSent ()); } visszaküldés; }

Tehát, amint láthatja, a modell leképező segítségével az átalakítási logika gyors és egyszerű - használjuk a térkép A leképező API-ja és az adatok konvertálása egyetlen konverziós logika sorának megírása nélkül.

6. Egység tesztelése

Végül végezzünk egy nagyon egyszerű tesztet annak biztosítására, hogy az entitás és a DTO közötti konverziók jól működjenek:

public class PostDtoUnitTest {private ModelMapper modelMapper = new ModelMapper (); @Test public void whenConvertPostEntityToPostDto_thenCorrect () {Post post = new Post (); post.setId (1L); post.setTitle (randomAlphabetic (6)); post.setUrl ("www.test.com"); PostDto postDto = modelMapper.map (post, PostDto.class); assertEquals (post.getId (), postDto.getId ()); assertEquals (post.getTitle (), postDto.getTitle ()); assertEquals (post.getUrl (), postDto.getUrl ()); } @Test public void whenConvertPostDtoToPostEntity_thenCorrect () {PostDto postDto = new PostDto (); postDto.setId (1L); postDto.setTitle (randomAlphabetic (6)); postDto.setUrl ("www.test.com"); Post post = modelMapper.map (postDto, Post.class); assertEquals (postDto.getId (), post.getId ()); assertEquals (postDto.getTitle (), post.getTitle ()); assertEquals (postDto.getUrl (), post.getUrl ()); }}

7. Következtetés

Ez egy cikk volt egyszerűsíti az Entity-ről DTO-ra és DTO-ról Entity-re történő átalakítást egy Spring REST API-ban, a mapper könyvtár modell használatával ahelyett, hogy ezeket a konverziókat kézzel írná.

A példák teljes forráskódja a GitHub projektben érhető el.

REST alsó

Most jelentettem be az újat Tanulj tavaszt tanfolyam, amelynek középpontjában az 5. tavasz és a tavaszi bakancs 2 alapjai állnak:

>> ELLENŐRIZZE A FOLYAMATOT