在讨论这些是什么的时候,建议先看看这篇文章:
https://juejin.cn/post/7312357312445481012
在上面这篇文章中提到的缺乏模型抽象,无边界控制,就是正好对应的DTO BO PO VO这些模型的概念
如何对模型进行抽象,控制边界,可用看看这篇文章 :
https://juejin.cn/post/7333458486435987494
在后端开发中,比如传统的MVC架构和现在流行的DDD架构,经常会使用到下列几种对象的概念
举个实际代码的例子,这里暂不给出VO,在最后的总结会讲这个VO
@Data
public class User implements Serializable{
private Long id;
private String username;
private String password;
private String identityCard;
private String gender;
private String location;
private String userImage;
private String phoneNumber;
private String createTime;
private String updateTime;
@TableLogic
private int isDelete;
}
@Data
public class UserDTO implements Serializable{
private Long id;
private String username;
private String password;
private String identityCard;
private String gender;
private String location;
private String userImage;
private String phoneNumber;
}
@Data
public class UserLoginBO implements Serializable{
private String username;
private String password;
}
@Data
public class UserUpdateBO implements Serializable{
private Long id;
private String username;
private String password;
private String identityCard;
private String gender;
private String location;
private String userImage;
private String phoneNumber;
}
从上面这个例子大家能看出来区别不
UserDTO是一个大的入口,它可以接收整个模块的参数
BO则是在进入Service层之前对UserDTO的数据进行过滤,并且对边界进行控制
最后在进入infra层之前转为PO
其实BO也可以像UserDTO那样,直接一个UserBO包含UserLoginBO
和UserUpdateBO
,单纯的做模型转换,不做值过滤也可以
为什么我们通篇没有讲关于VO的事情呢?
我个人的理解是DTO能解决的事情没有必要再加一个VO,我们可以弄一个全局配置,将DTO里面为null值的字段全都过滤掉
这样就没有说将数据传给前端的时候需要加多一个VO
给出代码示例,这样配置就可以把DTO中为null值过滤掉,不会序列化发给前端
@Configuration
public class GlobalConfig extends WebMvcConfigurationSupport {
@Override
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
converters.add(mappingJackson2HttpMessageConverter());
}
/**
* 自定义mappingJackson2HttpMessageConverter
* 目前实现:空值忽略,空字段可返回
*/
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
return new MappingJackson2HttpMessageConverter(objectMapper);
}
}
来源:juejin.cn/post/7334691453833166848
End
锋哥简介
Java1234_小锋,真名:曹锋,前世界500强央企软件工程师,12年Java,Python老司机,技术专家,资深Java,Python讲师,小锋网络科技 光杠司令员,司令部:www.java1234.com,www.python222.com 每天坚持锻炼身体,坚持早睡早起,崇尚自由,平时喜欢带带Java学员 (已经成功指导2000+学员高薪就业),喜欢搞搞Java技术自媒体,搞搞产品,后期继续研究主流技术,包括大数据,人工智能等。锋哥在公众号里整理了一份Java从入门到入土高级视频+Java常见笔试面试题+Java优秀简历模版,有需要的,可以关注下锋哥公众号,回复【 资料 】领取。