春天顶部

通过参考,使用Spring 5和Spring Boot 2开始学习春天课程:

>>学习春天
休息顶部

通过参考,使用Spring 5和Spring Boot 2开始学习春天课程:

>>看看这个课程

1.概述

在本教程中,我们将处理需要发生的转换在Spring应用程序的内部实体和外部dto之间(数据传输对象)被发布回客户端。

进一步阅读:

Spring的RequestBody和ResponseBody注解

了解Spri金宝搏官网188beng @RequestBody和@ResponseBody注释。

MapStruct快速指南

一个快速和实用的指南使用MapStruct

2.模型映射器

让我们首先介绍我们将用于执行此实体-DTO转换的主要库,ModelMapper

我们将需要这种依赖pom.xml.

<依赖> < groupId > org。modelmapper 2.3.5 

检查是否存在此库的任何较新版本,去这里

然后我们会定义ModelMapper豆在我们的春天配置中:

@bean public modelmapper modelmapper(){return new modelmapper();}

3. DTO.

接下来让我们介绍这个双面问题的DTO方面,帖子DTO:

公共类Postdto {私有静态最终SimpledateFormat DateFormat = New SimpleDateFormat(“Yyyy-mm-dd hh:mm”);私人长ID;私有字符串标题;私有字符串URL;私有字符串日期;私人userdto用户;公共日期getSubmissionDateconverted(String TimeZone)抛出ParseException {datezone.gettimeZone(TimeZone));返回dateformat.parse(this.date);}公共void setSubmistrydate(日期日期,字符串时区){datezone.gettimezone(timezone));this.date = dateformat.format(日期); } // standard getters and setters }

请注意,两个自定义日期相关方法处理客户端和服务器之间的日期转换:

  • getsubmissionDateConverted()方法转换日期细绳成一个日期在服务器的时区中使用它来持久化帖子实体
  • setsubmissiondate()方法是将DTO的日期设置为帖子s日期在当前用户时区

4.服务层

现在让我们看看一个服务级操作,它显然将与实体(而不是DTO)一起工作:

public List getPostsList(int page, int size, String sortDir, String sort) {PageRequest pageReq = PageRequest;of(page, size, sort . direction . fromstring (sortDir), sort);Page posts = poststrepository .findByUser(userService.getCurrentUser(), pageReq);返回posts.getContent ();}

我们将看看上面的服务层,接下来的控制器层。这是转换实际发生的地方。

5.控制器层

接下来,让我们研究一个标准的控制器实现,为帖子资源。

我们将在这里展示一些简单的CRUD操作:创建,更新,获得一个,并获得所有。鉴于操作非常简单,我们对实体DTO转换方面特别感兴趣

@控制器类PostRestController {@Autowired private IPostService postService;@Autowired私有IUserService userService;@Autowired私有ModelMapper ModelMapper;@GetMapping @ResponseBody public List getPosts(…){//…列表 posts = postService。getPostsList(页面,大小,sortDir,排序);return posts.stream() .map(this::convertToDto) .collect(collators . tolist ());} @PostMapping @ResponseStatus(HttpStatus.CREATED) @ResponseBody public PostDto createPost(@RequestBody PostDto PostDto) {Post Post = convertToEntity(PostDto);Post postCreated = postService.createPost(Post));返回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); } }

这是我们的转换从帖子实体帖子

私有Postdto converttodto(post post){postdto postdto = modelmapper.map(post,postdto.class);postdto.setsubmissiondate(post.getsubmissionDate(),userservice.getCurrentUser()。getPreference()。gettimezone());返回Postdto;}

这是转换从DTO到一个实体

私有帖子转换托托(Postdto Postdto)抛出ParseException {Post Post = ModelMapper.map(Postdto,post.class);post.setsubmissiondate(postdto.getsubmissionDateconverted(Userservice.getCurrentUser()。getPreference()。gettimezone()));if(postdto.getId()!= null){post oldpost = postservice.getpostbyId(postdto.getId());post.setredditid(oldpost.getredditid());post.setsent(oldpost.issent());}返回帖子;}

因此,在模型映射器的帮助下,我们可以看到,转换逻辑快速简单。我们正在使用地图映射器的API,并在不撰写单线转换逻辑的情况下转换数据。

6.单元测试

最后,让我们做一个非常简单的测试,以确保实体和DTO之间的转换良好:

公共类Postdtounittest {private modelmapper modelmapper = new modelmapper();@test公共void whinconvertpostentitytopostdto_thencorrect(){post post = new post();post.setID(1L);post.settitle(Ormanalphabetic(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.getturl(),postdto.geturl());@test公共vod whingconvertpostdtotopostentity_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.结论

在本文中,我们详细介绍简化从实体到DTO的转换,并从DT到Spring REST API中的实体,通过使用模型映射程序库,而不是手动编写这些转换。

示例的完整源代码可用GitHub项目

春天底

使用Spring 5和Spring Boot 2开始,通过学习春天课程:

> >这门课程
休息底部

使用Spring 5和Spring Boot 2开始,通过学习春天课程 :

>>看看这个课程
27.评论
最古老的
最新的
内联反馈
查看所有评论
对这篇文章的评论关闭!