Entitás DTO átalakításra egy tavaszi REST API-hoz
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 FOLYAMATOT1. Á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ó