- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
最近项目上要求升级一个工具包 hutool 的版本,以解决安全漏洞问题,这不升级还好,一升级反而捅出了更大的篓子,究竟是怎么回事呢?
我们项目原先使用的 hutool 版本是5.7.2,在代码中,我们的数据传输对象DTO和数据实体对象中大量使用了工具包中的 BeanUtil.copyProperties() , 大体代码如下:
@Data
@ToString
public class DiagramDTO {
// 前端生产的字符串id
private String id;
private String code;
private String name;
}
@Data
@ToString
public class Diagram {
private Integer id;
private String code;
private String name;
}
public class BeanCopyTest {
public static void main(String[] args) {
// 前端传输的对象
DiagramDTO diagramDTO = new DiagramDTO();
// 如果前端传入的id事包含e的,升级后就会报错
diagramDTO.setId("3em3dgqsgmn0");
diagramDTO.setCode("d1");
diagramDTO.setName("图表");
Diagram diagram = new Diagram();
// 关键点,数据拷贝
BeanUtil.copyProperties(diagramDTO, diagram);
System.out.println("数据实体对象:" + diagram);
//设置id为空,自增
diagram.setId(null);
//保存到数据库中 TODO
//diagramMapper.save(diagram);
}
}
升级前, hutool 是5.7.2版本下,执行结果如下图.
BeanUtil.copyProperties
虽然字段类型不一样,但是做了兼容处理,所以业务没有影响业务逻辑。 升级后, hutool 是5.8.8版本,执行结果如下图所示:
我发现大部分人写代码都喜欢偷懒,在上面的场景中,虽然 BeanUtil.copyProperties 用的一时爽,但有时候带来的后果是很严重的,所以很不推荐这种方式。为什么这么说呢?
比如团队中的某些人偷偷改了数据传输对象DTO,比如修改了类型、删去了某个字段。用 BeanUtil.copyProperties 的方式压根无法在编译阶段发现,更别提修改的影响范围了,这就只能把风险暴露到生产上去了。那有什么更好的方法呢?
get
、 set
方式 我是比较推崇这种做法的,比如现在 DiagramDTO 删去某个字段,编译器就会报错,就会引起你的注意了,让问题提前暴露,无处遁形.
你可能觉得站着说话不腰疼,字段少好,如果字段很多还不得写死啊,我这里推荐一个IDEA的插件,可以帮你智能生成这样的代码.
话不多说,自己玩儿去~~ 。
ModelMapper
ModelMapper 是一个开源库,可以很方便、简单地将对象从一种类型映射到另一种类型,底层是通过反射来自动确定对象之间的映射,还可以自定义映射规则.
private static void testModelMapper() {
ModelMapper modelMapper = new ModelMapper();
DiagramDTO diagramDTO = new DiagramDTO();
diagramDTO.setId("3em3dgqsgmn0");
diagramDTO.setCode("d1");
diagramDTO.setName("图表");
Diagram diagram = modelMapper.map(diagramDTO, Diagram.class);
}
MapStruct
MapStruct 也是Java中另外一个用于映射对象很流行的开源工具。它是在编译阶段生成对应的映射代码,相对于 ModelMapper 底层放射的方案,性能更好.
@Mapper
public interface DiagramMapper {
DiagramMapper INSTANCE = Mappers.getMapper(DiagramMapper.class);
DiagramDTO toDTO(Diagram diagram);
Diagram toEntity(DiagramDTO diagram);
}
private static void testMapStruct() {
DiagramDTO diagramDTO = new DiagramDTO();
diagramDTO.setId("3em3dgqsgmn0");
diagramDTO.setCode("d1");
diagramDTO.setName("图表");
Diagram diagram = DiagramMapper.INSTANCE.toEntity(diagramDTO);
}
DiagramMapper
接口使用了 @Mapper
注解,用来表明使用 MapStruct
处理 MapStruct
中更多高级特性大家自己探索一下。 小结一下,对象在不同层之间进行转换映射,很不建议使用 BeanUtil.copyProperties 这种方式,更加推荐使用原生的 set , get 方式,不容易出错。当然这不是将 BeanUtil.copyProperties 一棒子打死,毫无用武之地,在特定场景,比如方法内部对象的转换等影响小的范围还是很方便的,如果你有其他的想法,也可以留下你的想法,一起探讨交流.
欢迎关注个人公众号【JAVA旭阳】交流学习!! 。
最后此篇关于麻了,不要再动不动就BeanUtil.copyProperties!!!的文章就讲到这里了,如果你想了解更多关于麻了,不要再动不动就BeanUtil.copyProperties!!!的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个具有多个依赖项的项目,最终导致 取决于以下内容(我从 sbt-dependency-graph plugin 得到这些): commons-beanutils:commons-beanutil
我在使用列表时遇到了 Axis2 v1.6.1 和 v1.6.2 的以下问题: java.lang.StackOverflowError: org.apache.axis2.databinding.u
前言 呵呵 前端时间使用 BeanUtils.copyProperties 的时候碰到了一个这样的问题 我有两个实体, 有同样的属性, 一个有给定的属性的 getter, 另外一个有 给定的属性
目录 BeanUtils.copyProperties复制属性失败 描述 解决办法 BeanUtils.copyProper
目录 1.前言 2.一般使用 3.拷贝属性时忽略空值 4.使用注意事项(1) 5.使用注意事项(2) 6.使用注意事项(3)
我尝试使用 BeanUtils 将数据(java.util.Date)值从源复制到目标。它给出了日期到字符串转换异常。 此类问题的解决方案是什么? 我的实现如下.. import java.util
有这个: public class Parent { private String name; private int age; private Date birthDate;
我有一个 Web 项目,其中 BeanUtils 用于操作 bean。 在我的代码中,为了使 BeanUtils 将字符串记录正确地传输到 java.util.Date 字段中,一个 DateConv
目录 BeanUtils.copyProperties()参数的赋值顺序 BeanUtils.copyProperties初体验,及其参数含义解释
目录 BeanUtils.copyProperties()拷贝id属性失败 部分代码如下 解决方法 BeanUtils.co
场景 开发中经常遇到,把父类的属性拷贝到子类中。通常有2种方法: 1、一个一个set 2、用BeanUtils.copyProperties 很显然BeanUtils更加方便,也美观很多。 那么任
我有以下类(class): import org.apache.commons.beanutils.BeanUtils; import com.thoughtworks.xstream.XStream
我正在使用 BeanUtils.copyProperties 将一个对象的全部内容复制到从它继承的另一个对象中。 这里是上下文,从中复制值的域对象包含一组自定义类型 Xref 的对象。该自定义类型有一
org.apache.commons.beanutils.BeanUtils: BeanUtils.populate(Object bean, Map properties); Populate th
嗨,仍然学习一些java概念。很抱歉,如果这是一个愚蠢的问题 我在 jar 里有一个类。我正在使用反射动态地将它加载到我的类路径中。然后我像这样调用类构造函数方法: File jar
我正在尝试实现一些在我的实体和 DTO 之间进行转换的东西。 我有 DTO 的基类(称为模型): public class BaseModel implements Model { @Over
我使用PropertyUtils.copyProperties从Apache Commons BeanUtils在两个bean之间复制属性,现在遇到一个问题:两个bean中有同名字段,一个是Long类
我有一段代码,我使用 BeanUtils.copyProperities(dest, orig) 将一个类的相似属性复制到另一个类。然而。这是行不通的。我收到错误: 线程“main”中的异常 java
我想将 bean 类转换为映射(key=成员的名称,value=成员的值)。 我正在使用方法 BeanUtils.describe(beanClass); (编辑:我正在使用commons-beanu
我正在考虑使用 Apache BeanUtils 来管理我项目中的一些数据结构。该任务是针对仅在运行时已知的任意路径从列表中删除项。 我想我可以使用 BeanUtils 通过这样的调用将项目设置为 n
我是一名优秀的程序员,十分优秀!