SpringBoot 入门教程之引入数据传输层的方法
我们现在操作的数据直接就使用了实体类,假如我们输出的用户对象需要包含用户拥有的权限列表,那么我们怎么封装呢?
直接封装进实体类中显然不行,因为实体类的职责就是提供与数据库表字段一一对应的映射关系,所以我们还需要封装出一层数据传输层DTO(DataTransferObject),通过它暴露给外部,这样我们就能高度定制化我们需要输出的数据而不会影响到实体类。
在项目中创建dto目录,新建UserDto.java文件:
packagecom.foxescap.wxbox.dto;
importlombok.Data;
importjava.time.LocalDateTime;
/**
*@authorxfly
*/
@Data
publicclassUserDto{
privateStringusername;
privateLocalDateTimeexpiredAt;
privateLocalDateTimecreatedAt;
privateListroles;
}
结构看上去基本和对应的实体类非常相似,职责区别就是:
•我不想暴露出去的字段可以直接不声明。
•我可以加如其他的DTO作为其中的属性,如上所示。
对应我们的Service层就需要在拿到实体类对象后转换成DTO对象:
publicUserDtofindByUsername(Stringusername){
varuser=lambdaQuery().eq(User::getUsername,username).one();
varuserDto=newUserDto();
userDto.setUsername(user.getUsername());
userDto.setExpiredAt(user.getExpiredAt());
userDto.setCreatedAt(user.getCreatedAt());
returnuserDto;
}
这里你会发现,这个转换的过程特别难受,就像写Getter和Setter方法一样,写多了要吐了。
我会写吐别人也一样会写吐,然后就会有轮子造出来,modelmapper就是解决这样需求的一个用的人比较多的轮子。
在pom.xml项目配置文件中的dependencies中加入modelmapper依赖:
org.modelmapper modelmapper 2.3.7
然后在config目录中的WebMvcConfig.java文件中注入这个对象:
@Bean
publicModelMappermodelMapper(){
ModelMappermodelMapper=newModelMapper();
modelMapper.getConfiguration().setFullTypeMatchingRequired(true);
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);
returnmodelMapper;
}
我们这个时候再来改造一下findByUsername方法:
privatefinalModelMappermodelMapper;
publicUserService(ModelMappermodelMapper){
this.modelMapper=modelMapper;
}
publicUserDtofindByUsername(Stringusername){
varuser=lambdaQuery().eq(User::getUsername,username).one();
returnmodelMapper.map(user,UserDto.class);
}
到此这篇关于SpringBoot入门教程之引入数据传输层的方法的文章就介绍到这了,更多相关SpringBoot引入数据传输层内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!