ישות להמרת DTO עבור ממשק API של 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 תחתון