ישות להמרת DTO עבור ממשק API של REST באביב

REST למעלה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. סקירה כללית

במדריך זה נטפל בהמרות שצריכות להתרחש בין הגופים הפנימיים של יישום אביב לבין ה- DTO החיצוניים (אובייקטים להעברת נתונים) המתפרסמים בחזרה ללקוח.

2. ממפה מודל

נתחיל בהצגת הספרייה הראשית בה נשתמש לביצוע המרת ישות-DTO זו - ModelMapper.

נצטרך תלות זו ב pom.xml:

 org.modelmapper modelmapper 2.3.5 

כדי לבדוק אם קיימת גרסה חדשה יותר של ספרייה זו, עבור לכאן.

נגדיר את ה- ModelMapper שעועית בתצורת האביב שלנו:

@Mean ModelMapper הציבור ModelMapper () {להחזיר ModelMapper חדש (); }

3. ה- DTO

לאחר מכן, בואו להציג את הצד של ה- DTO בבעיה דו-צדדית זו - הודעה DTO:

מחלקה ציבורית PostDto {גמר סטטי פרטי SimpleDateFormat dateFormat = חדש SimpleDateFormat ("yyyy-MM-dd HH: mm"); פרטי ארוך מזהה; כותרת מחרוזת פרטית; כתובת מחרוזת פרטית; תאריך מחרוזת פרטי; משתמש UserDto פרטי; תאריך ציבורי getSubmissionDateConverted (אזור זמן מחרוזת) זורק ParseException {dateFormat.setTimeZone (TimeZone.getTimeZone (אזור זמן)); תאריך החזרה Format.parse (this.date); } public void setSubmissionDate (תאריך תאריך, אזור זמן מחרוזת) {dateFormat.setTimeZone (TimeZone.getTimeZone (אזור זמן)); this.date = dateFormat.format (תאריך); } // גטרים וקובעים סטנדרטיים} 

שים לב ששתי השיטות הקשורות לתאריך המותאם אישית מטפלות בהמרת התאריך הלוך ושוב בין הלקוח לשרת:

  • getSubmissionDateConverted () שיטת המרת תאריך חוּט לתוך תַאֲרִיך באזור הזמן של השרת כדי להשתמש בו בהתמדה הודעה יֵשׁוּת
  • setSubmissionDate () השיטה היא להגדיר את התאריך של DTO ל- הודעהשל תַאֲרִיך באזור הזמן הנוכחי של המשתמש.

4. שכבת השירות

בואו נסתכל על פעולה ברמת השירות - שברור שתעבוד עם הישות (לא ה- DTO):

רשימה ציבורית getPostsList (דף int, גודל int, מחרוזת sortDir, מחרוזת מיון) {PageRequest pageReq = PageRequest.of (דף, גודל, Sort.Direction.fromString (sortDir), מיון); פוסטים בדף = postRepository .findByUser (userService.getCurrentUser (), pageReq); הודעות החזרה. getContent (); }

אנו נסתכל על השכבה מעל השירות הבא - שכבת הבקר. זה המקום שבו ההמרה אכן תתרחש גם כן.

5. שכבת הבקר

בואו נסתכל על יישום בקר רגיל, ונחשוף את ה- REST API הפשוט עבור ה- הודעה מַשׁאָב.

אנו נציג כאן כמה פעולות CRUD פשוטות: ליצור, לעדכן, להשיג אחד ולקבל הכל. ובהתחשב בפעולות די פשוטות, אנו מתעניינים במיוחד בהיבטי ההמרה של ישות-DTO:

מחלקה @ Controller PostRestController {@PostService פרטית אוטומטית postService; @ UserService פרטי IAserService פרטי; @Autowired פרטי ModelMapper modelMapper; @GetMapping @ResponseBody רשימה ציבורית getPosts (...) {// ... רשימת הודעות = postService.getPostsList (דף, גודל, sortDir, מיון); return posts.stream () .map (this :: convertToDto) .collect (Collectors.toList ()); } @PostMapping @ResponseStatus (HttpStatus.CREATED) @ResponseBody ציבורי PostDto createPost (@RequestBody PostDto postDto) {Post post = convertToEntity (postDto); Post postCreated = postService.createPost (post)); החזר convertToDto (postCreated); } @ GetMapping (value = "/ {id}") @ ResponseBody ציבורי PostDto getPost (@PathVariable ("id") מזהה ארוך) {return convertToDto (postService.getPostById (id)); } @ PutMapping (value = "/ {id}") @ ResponseStatus (HttpStatus.OK) updatePost חלל ציבורי (@ RequestBody PostDto postDto) {Post post = convertToEntity (postDto); postService.updatePost (פוסט); }}

והנה הגיור שלנו מ הודעה ישות ל PostDto:

פרטי PostDto convertToDto (פוסט פוסט) {PostDto postDto = modelMapper.map (פוסט, PostDto.class); postDto.setSubmissionDate (post.getSubmissionDate (), userService.getCurrentUser (). getPreference (). getTimezone ()); חזרה postDto; }

והנה הגיור מ- DTO לישות:

הודעה פרטית convertToEntity (PostDto postDto) זורק ParseException {Post post = modelMapper.map (postDto, Post.class); post.setSubmissionDate (postDto.getSubmissionDateConverted (userService.getCurrentUser (). getPreference (). getTimezone ())); אם (postDto.getId ()! = null) {Post oldPost = postService.getPostById (postDto.getId ()); post.setRedditID (oldPost.getRedditID ()); post.setSent (oldPost.isSent ()); } הודעה חוזרת; }

אז, כפי שאתה יכול לראות, בעזרת ממפה המודל, לוגיקת ההמרה מהירה ופשוטה - אנו משתמשים ב- מַפָּה ממשק API של המפות וקבלת המרת הנתונים מבלי לכתוב שורה אחת של לוגיקת המרה.

6. בדיקת יחידות

לסיום, בואו נעשה בדיקה מאוד פשוטה כדי לוודא שההמרות בין הישות ל- DTO עובדות טוב:

מחלקה ציבורית PostDtoUnitTest {פרטי ModelMapper modelMapper = ModelMapper חדש (); @ מבחן ציבורי בטל כאשר ConvertPostEntityToPostDto_thenCorrect () {פוסט פוסט = פוסט חדש (); post.setId (1L); post.setTitle (randomAlphabetic (6)); post.setUrl ("www.test.com"); PostDto postDto = modelMapper.map (פוסט, PostDto.class); assertEquals (post.getId (), postDto.getId ()); assertEquals (post.getTitle (), postDto.getTitle ()); assertEquals (post.getUrl (), postDto.getUrl ()); } @Test ציבורי בטל כאשר ConvertPostDtoToPostEntity_thenCorrect () {PostDto postDto = PostDto חדש (); postDto.setId (1L); postDto.setTitle (randomAlphabetic (6)); postDto.setUrl ("www.test.com"); פוסט פוסט = modelMapper.map (postDto, Post.class); assertEquals (postDto.getId (), post.getId ()); assertEquals (postDto.getTitle (), post.getTitle ()); assertEquals (postDto.getUrl (), post.getUrl ()); }}

7. מסקנה

זה היה מאמר על לפשט את ההמרה מישות ל- DTO ומ- DTO לישות ב- REST API של אביב, באמצעות ספריית מיפוי מודלים במקום לכתוב המרות אלה ביד.

קוד המקור המלא של הדוגמאות זמין בפרויקט GitHub.

REST תחתון

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס