首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在使用BeanCopier复制属性时忽略某些字段

在使用BeanCopier复制属性时,可以通过自定义转换器或者使用注解来忽略某些字段。

  1. 自定义转换器: 可以通过实现自定义转换器来忽略某些字段的复制。在转换器中,可以判断源对象的字段是否需要复制到目标对象中,如果不需要,则跳过该字段的复制操作。

示例代码如下:

代码语言:txt
复制
public class IgnoreFieldsConverter implements Converter {
    private Set<String> ignoreFields;

    public IgnoreFieldsConverter(Set<String> ignoreFields) {
        this.ignoreFields = ignoreFields;
    }

    @Override
    public void convert(Object source, Object target, Object fieldName, Class<?> fieldType) {
        if (!ignoreFields.contains(fieldName)) {
            BeanUtils.copyProperty(source, target, fieldName);
        }
    }
}

使用时,可以将需要忽略的字段名添加到ignoreFields集合中,然后在复制属性时传入该转换器。

代码语言:txt
复制
Set<String> ignoreFields = new HashSet<>();
ignoreFields.add("fieldName1");
ignoreFields.add("fieldName2");

BeanCopier copier = BeanCopier.create(sourceClass, targetClass, true);
copier.copy(source, target, new IgnoreFieldsConverter(ignoreFields));
  1. 使用注解: 另一种方法是使用注解来标记需要忽略的字段,在复制属性时根据注解判断是否进行复制。

首先,定义一个注解@IgnoreField

代码语言:txt
复制
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface IgnoreField {
}

然后,在源对象的字段上添加@IgnoreField注解,表示该字段需要被忽略。

代码语言:txt
复制
public class SourceObject {
    @IgnoreField
    private String ignoredField;
    // other fields
}

最后,在复制属性时,判断源对象的字段是否被@IgnoreField注解标记,如果没有,则进行复制。

代码语言:txt
复制
BeanCopier copier = BeanCopier.create(sourceClass, targetClass, true);
copier.copy(source, target, (sourceValue, targetValue, targetClass, targetField) -> {
    if (targetField.isAnnotationPresent(IgnoreField.class)) {
        return;
    }
    BeanUtils.copyProperty(sourceValue, targetValue, targetField.getName());
});

这样,在复制属性时,被@IgnoreField注解标记的字段将会被忽略。

以上是使用BeanCopier复制属性时忽略某些字段的方法,可以根据具体需求选择适合的方式来实现。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java对象拷贝_对象的拷贝有几种方法

其实有很多种方法进行属性拷贝的,例如dozer等等 下面看下测试性能吧:以:万级进行测试,我觉得Cglib太给力了.可以在遇到属性拷贝瓶颈考虑.当然他们各有优点哈,功能也不尽相同.还需要多使用体会....如果你仅是在日常处理少量的对象,选取哪个其实变得并不重要,但数据量大建议还是使用MapStruct 或 BeanCopier 的方式,提高接口性能 一、背景 1.1 对象拷贝概念 Java中,数据类型分为值类型...浅拷贝与深拷贝差异 分类 浅拷贝 深拷贝 区别 创建一个新对象,然后将当前对象的非静态字段复制到该新对象,如果字段是值类型的,那么对该字段执行复制;如果该字段是引用类型的话,则复制引用但不复制引用的对象...创建一个新对象,然后将当前对象的非静态字段复制到该新对象,无论该字段是值类型的还是引用类型,都复制独立的一份。当你修改其中一个对象的任何内容,都不会影响另一个对象的内容。...BeanCopier支持两种方式: 一种是不使用Converter的方式,仅对两个bean间属性名和类型完全相同的变量进行拷贝; 另一种则引入Converter,可以对某些特定属性值进行特殊操作。

4.8K10

是时候丢掉 BeanUtils 了!

cglib 的 BeanCopier使用动态技术代替反射,在运行时生成一个子类,只有在第一次动态生成类慢,后面基本就本接近原始的set,所以呀运行效率比上面两种要高很多。...另一次拷贝的时候会把所有属性都拷过去,漏掉忽略主键 id,结果在插入的时候报了唯一索引冲突。...这个可以参见 issus 上的讨论:issus1428 issus3186 忽略指定字段 忽略字段可以使用 Mapping 注解的 ignore 属性,如下: @Mapping(target = "id...", ignore = true) 如果我想忽略某些字段,并且复用起来,就像我们的场景应用,可以定义一个IgnoreFixedField注解,然后打在方法上 @Mapping(target = "id...在这里[1] 注解我们非常熟悉,其实java里的注解有两种,一种是运行时注解,如常用 @Resource, @Autowired,另一种是编译注解, lombok 的 @Data。

6410

关于领域模型转换的那些事儿

,报错 不能部分属性复制 得到的目标对象部分属性成功(这点很要命,部分成功,部分失败!)...paymentType":"CASH", "totalMoney":"829.990000000000009094947017729282379150390625" } 缺点: 日期不符合要求 属性名不一样复制...第五种,Spring封装BeanUtils工具类,代码如下: // 对象属性转换,忽略orderedProducts字段 BeanUtils.copyProperties(orderDTO, orderVO...第六种,cglib工具包BeanCopier: cglib的BeanCopier采用了不同的方法:它不是利用反射对属性进行赋值,而是直接使用ASM的MethodVisitor直接编写各属性的get/set...我目前个人使用较多的是MapStruct和BeanCopier,后期有空会单独写一篇文章介绍MapStruct的使用

1.1K10

对象拷贝类cglib的使用实例

org.springframework.beans.BeanUtils.copyProperties(Object source, Object target, Class editable, String[] ignoreProperties) cglib版本:(使用动态代理...>class2){ return class1.toString() + class2.toString(); } /注: (1)相同属性名,且类型不匹配时候的处理,ok,但是未满足的属性不拷贝;...(2)get和set方法不匹配的处理,创建拷贝的时候报错,无法拷贝任何属性(当且仅当sourceClass的get方法超过set方法出现) (3)BeanCopier 初始化例子:BeanCopier...,默认BeanCopier只会做同名,同类型属性的copier,否则就会报错. copier = BeanCopier.create(source.getClass(), target.getClass...; ++i) { 111 names2.put(setters[i].getName(), getters[i]); } 调用这行代码前判断查询下,如果没有改writeMethod则忽略掉该字段的操作

1.7K20

打开orika的正确方式

其二,远程调用需要额外注意网络传输的开销,如果生产者方从数据库加载出了一个一对多的依赖,而消费者只需要一这个实体的某个属性,多的实体会使得性能产生下降,并没有很好的方式对其进行控制(忽略手动set)。...apache支持名称相同但类型不同的属性的转换,spring支持忽略某些属性不进行映射,他们都设置了缓存保存已解析过的 BeanInfo信息。...BeanCopier cglib的 BeanCopier采用了不同的方法:它不是利用反射对属性进行赋值,而是直接使用ASM的 MethodVisitor直接编写各属性的 get/set方法(具体过程可见...Dozer 使用以上类库虽然可以不用手动编写 get/set方法,但是他们都不能对不同名称的对象属性进行映射。...在定制化的属性映射方面做得比较好的有Dozer,Dozer支持简单属性映射、复杂类型映射、双向映射、隐式映射以及递归映射。可使用xml或者注解进行映射的配置,支持自动类型转换,使用方便。

3.7K110

java对象拷贝最完全解说 转

原生的clone()方法。...如何进行对象克隆 Object对象有个clone()方法,实现了对象中各个属性复制,但它的可见范围是protected的,所以实体类使用克隆的前提是: ① 实现Cloneable接口,这是一个标记接口...浅拷贝:被复制对象的所有值属性都含有与原来对象的相同,而所有的对象引用属性仍然指向原来的对象。 深拷贝:在浅拷贝的基础上,所有引用其他对象的变量也进行了clone,并指向被复制过的新对象。...如果一个被复制属性都是基本类型,那么只需要实现当前类的cloneable机制就可以了,此为浅拷贝。...公平起见,避免某些工具库使用缓存机制,使用原型方式工厂。

1.2K20

为什么阿里代码规约要求避免使用 Apache BeanUtils 进行属性复制

于是我建议这位小伙伴了解一下 BeanUtils,后来他使用了 Apache BeanUtils.copyProperties 进行属性拷贝,这为程序挖了一个坑!...阿里代码规约 当我们开启阿里代码扫描插件,如果你使用了 Apache BeanUtils.copyProperties 进行属性拷贝,它会给你一个非常严重的警告。...因为,Apache BeanUtils性能较差,可以使用 Spring BeanUtils 或者 Cglib BeanCopier 来代替。 ? 看到这样的警告,有点让人有点不爽。...包装类默认值 在进行属性拷贝,低版本CommonsBeanUtils 为了解决Date为空的问题会导致为目标对象的原始类型的包装类属性赋予初始值, Integer 属性默认赋值为 0,尽管你的来源对象该字段的值为...这个在我们的包装类属性为 null 值时有特殊含义的场景,非常容易踩坑!例如搜索条件对象,一般 null 值表示该字段不做限制,而 0 表示该字段的值必须为0。

4.2K30

12种 vo2dto 方法,就 BeanUtil.copyProperties 压测数据最拉跨!

目前我整理出,用于对象属性转换有12种,包括:普通的getset、json2Json、Apache属性拷贝、Spring属性拷贝、bean-mapping、bean-mapping-asm、BeanCopier...mapperFactory.classMap(UserDTO.class, UserVO.class) .field("userId", "userId") // 字段不一致可以指定...,递归的方式复制对象 点评:性能有点差,不建议使用 10....四、总结 其实对象属性转换的操作无非是基于反射、AOP、CGlib、ASM、Javassist 在编译和运行期进行处理,再有好的思路就是在编译前生成出对应的get、set,就像手写出来的一样。...无论哪种使用,都要做一下完整的测试和验证,不要上来就复制粘贴,否则你可能早早的就把挖好坑了,当然不一定是哪个兄弟来填坑了。

1.1K30

无惧性能烦恼-12款Bean拷贝工具压测大比拼

在进行对象转换,除了手动get/set之外,开发者大概率会使用到类似BeanUtils等对象拷贝工具类。...排名最后的4个工具依旧简单对象拷贝排名类似,性能均很差。 CPU频率图 ?...# 结论 通过两组不同类型的对象,我们对12款工具进行了压测实验,最后结果表示BeanCopier和MapStruct依旧是市场中最顶级的两款工具类,两者均拥有相同于原生get/set的性能,在使用时需要考虑使用缓存...高性能拷贝的基石是浅拷贝,请确保拷贝后不再对源对象source进行修改,即拷贝时机发生在必要的转换Controller层返回给前端VO,数据库层对象DO出库给各个接口使用返回DTO,因为源对象source...通常而言MapStruct更为强大,编译期生成get/set让人更加放心,但缺点就是基本的转换也需要写interface,而BeanCopier不需要这点,仅在特殊转换需要写Converter。

2.5K41
领券