JAVA Bean 转换工具 BULL 使用简介

javabiginteger源码-bull:BULL-BeanUtilsLight库 java biginteger源码 Bean Utils Light 库 BULL 是一个 Java Bean 到 Java Bean 转换器,它递归地将数据从一个对象复制到另一个对象,它是通用的、灵活的、可重用的、可配置的,并且速度非常快。 它是唯一能够在没有任何自定义配置的情况下转换 Mutable、Immutable 和 Mixed bean 的库。 开始使用 所有 BULL 模块都可以在 Maven Central 上找到: 豆类物料清单 它包含项目中可用的所有模块 < dependency > < groupId >com.hotels.beans</ groupId > < artifactId >bull-bom</ artifactId > < version >x.y.z</ version > </ dependency > 豆变压器 < dependency > < groupId >com.hotels.beans</ groupId > < artifactId >bull-bean-transformer</ artifactId > < version > 立即下载

How to Transform Any Type of Java Bean With BULL

在跨团队或者跨系统的开发调用时,经常遇到 两个系统Java 代码命名不一致的情况,简单直接的办法就是写一堆get set

如果能拿到对方的jar 或者源码 亦可以使用对方的命名:

例如

对店铺的定义

A系统

public class shop{
	private long id ;
	private String name;
	private String address;
	}

B系统

public class  store{
	private Long  storeId;
	private String name;
	private String location;
	}

BULL 的使用

一、maven 的引入

The project provides two different builds, one compatible with jdk 8 (or above) and one with jdk 11 or above.

BULL提供了两个版本的jar
一个基于JDK8

一个基于JDK11

<dependency>
    <groupId>com.hotels.beans</groupId>
    <artifactId>bull-bean-transformer</artifactId>
    <version>1.7.1</version>
</dependency>

二、特性

The macro features explained in this article are:

JAVA 对象转换 Bean transformation
JAVA 对象验证 Bean validation

三、对象转换

3.1

例如 给出两个不同的bean

public class FromBean {                                     public class ToBean {                           
   private final String name;                                  public BigInteger id;                                  
   private final BigInteger id;                                private final String name;                             
   private final List<FromSubBean> subBeanList;                private final List<String> list;                       
   private List<String> list;                                  private final List<ImmutableToSubFoo> nestedObjectList;
   private final FromSubBean subObject;                        private ImmutableToSubFoo nestedObject;                
    // all args constructor                                     // constructors                                         
   // getters and setters...                                    // getters and setters
}                                                           }

The transformation can be obtained with the following line of code:

ToBean toBean = new BeanUtils().getTransformer().transform(fromBean, ToBean.class);

简单的不同名称,成员变量同名的对象转换,spring 框架也也提供了类似功能。

3.2 不同成员名称的对象转换

Different Field Names Copy

需要组装一个map ,定义好转换的对应关系。

public class FromBean {                                     public class ToBean {                           
   private final String name;                                  private final String differentName;                   
   private final int id;                                       private final int id;                      
   private final List<FromSubBean> subBeanList;                private final List<ToSubBean> subBeanList;                 
   private final List<String> list;                            private final List<String> list;                    
   private final FromSubBean subObject;                        private final ToSubBean subObject;                    
   // all constructors                                         // all args constructor
   // getters...                                               // getters... 
}                                                            }

We need to define proper field mappings and pass it to theTransformer object:

// the first parameter is the field name in the source object
// the second one is the the field name in the destination one 
FieldMapping fieldMapping = new FieldMapping("name", "differentName");
Tansformer transformer = new BeanUtils().getTransformer().withFieldMapping(fieldMapping);

Then, we can perform the transformation:

ToBean toBean = transformer.transform(fromBean, ToBean.class);

3.3 不同层级的数据转换

FromBean 有一个成员也是 Bean 对象

需要FromsubBean 成员 转换成ToBean 成员变量

public class FromSubBean {                         
   private String serialNumber;                 
   private Date creationDate;                    
   // getters and setters... 
}

and our source class and destination class are described as follow:

public class FromBean {                                     public class ToBean {                           
   private final int id;                                       private final int id;                      
   private final String name;                                  private final String name;                   
   private final FromSubBean subObject;                        private final String serialNumber;                 
                                                               private final Date creationDate;                    
   // all args constructor                                     // all args constructor
   // getters...                                               // getters... 
}                                                           }

…and that the values for fields serialNumber and creationDate into the ToBean object need to be retrieved from subObject, this can be done defining the whole path to the property dot separated:

FieldMapping serialNumberMapping = new FieldMapping("subObject.serialNumber", "serialNumber");                                                             
FieldMapping creationDateMapping = new FieldMapping("subObject.creationDate", "creationDate");
ToBean toBean = new BeanUtils().getTransformer()
                   .withFieldMapping(serialNumberMapping, creationDateMapping)
                   .transform(fromBean, ToBean.class);

3.4 使用构造方法

Different Field Names Defining Constructor Args
The mapping between different fields can also be defined by adding @ConstructorArg annotation next to constructor arguments.

The @ConstructorArg takes as input the name of the correspondent field in the source object.

public class FromBean {                                     public class ToBean {                           
   private final String name;                                  private final String differentName;                   
   private final int id;                                       private final int id;                      
   private final List<FromSubBean> subBeanList;                private final List<ToSubBean> subBeanList;                 
   private final List<String> list;                            private final List<String> list;                    
   private final FromSubBean subObject;                        private final ToSubBean subObject;                    
   // all args constructor
   // getters...                                                                }
     
}
subBeanList                                                       

public ToBean(@ConstructorArg("name") final String differentName, 
 @ConstructorArg("id") final int id,
@ConstructorArg("subBeanList") final List<ToSubBean> 
 @ConstructorArg(fieldName ="list") final List<String> list,
 @ConstructorArg("subObject") final ToSubBean subObject) {
 this.differentName = differentName;
this.id = id;
 this.subBeanList = subBeanList;
 this.list = list;
this.subObject = subObject; 
 }
 // getters...           

3.5 使用lamda 表达式转换

Apply a Custom Transformation on a Specific Field Lambda Function

The destination object has a totally different structure than the source object
目标对象和来源对象有不同的结构
We need to perform some operation on a specific field value before copying it
复制操作前需要处理数据
The destination object’s fields have to be validated
目标对象成员变量有校验
The destination object has an additional field than the source object that needs to be filled with something coming from a different source
目标对象有附加的成员变量,来源对象需要做特殊处理

Given the following Source class:

public class FromFoo {
  private final String id;
  private final String val;
  private final List<FromSubFoo> nestedObjectList;
  // all args constructor   
  // getters
}

And the following Destination class:

public class MixedToFoo {
  public String id;
  @NotNull
  private final Double val;
  // constructors
  // getters and setters
}
FieldTransformer<String, Double> valTransformer =
     new FieldTransformer<>("val",
                      n -> Double.valueOf(n) * Math.random());
MixedToFoo mixedToFoo = new BeanUtils().getTransformer()
      .withFieldTransformer(valTransformer)
      .transform(fromFoo, MixedToFoo.class);

3.6 在源对象中缺少字段的情况下应用转换函数

public class FromBean {                                     public class ToBean {                           
   private final String name;                                  @NotNull                   
   private final BigInteger id;                                public BigInteger id;                      
                                                               private final String name;                 
                                                               private String notExistingField; // this will have value: sampleVal
   // all args constructor                                     // constructors...
   // getters...                                               // getters and setters...
}                                                           }

What we need to do is to assign a FieldTransformer function to a specific field:

FieldTransformer<String, String> notExistingFieldTransformer =
                    new FieldTransformer<>("notExistingField", () -> "sampleVal");

以上代码赋予一个固定值,我们可以使用方法
The above functions will assign a fixed value to the field notExistingField, but we can return whatever, for example, we can call an external method that returns a value obtained after a set of operation, something like:
例如:
定义一个calculatevalue()

FieldTransformer<String, String> notExistingFieldTransformer =
                    new FieldTransformer<>("notExistingField", () -> calculateValue());

However, in the end, we just need to pass it to the Transformer.

ToBean toBean = new BeanUtils().getTransformer()
   .withFieldTransformer(notExistingFieldTransformer)
   .transform(fromBean, ToBean.class);

4 Bean Validation

对象验证

The class validation against a set of rules can be precious, especially when we need to be sure that the object data is compliant with our expectations.

The “field validation” aspect is one of the features offered by BULL and it’s totally automatic — you only need to annotate your field with one of the existing javax.validation.constraints (or defining a custom one) and then execute the validation on this.

Given the following bean:

public class SampleBean {                           
   @NotNull                   
   private BigInteger id;                      
   private String name;                 
   // constructor
   // getters and setters... 
}

An instance of the above object:

SampleBean sampleBean = new SampleBean();

And one line of code, such as:

new BeanUtils().getValidator().validate(sampleBean);

This will throw an InvalidBeanException, as the field id isnull.

参考资料:https://dzone.com/articles/how-to-transform-any-type-of-java-bean-with-one-li

本科双非的计算机考研择校注意点——经验贴 一战一志愿上岸某211的电子信息专硕。之前在某乎也发过帖子。但现在用优快云,所以把相关的心得再发出来仅供大家参考。 首先,我认为最重要的是你为什么要考研? 不管你是为了混一个文凭将来好进大厂,还是为了真正搞学术或者学知识,你要知道你自己的目标,只有坚定自己的目标,才有动力去走完这段复习的历程。真正的考研,是很苦的。如果你是为了逃避大四面临的就业才选择考研,并且还浑浑噩噩不当回事,那我劝你放弃,不如踏踏实实学点技术去找实习。那从我自己出发,我是认为自己本科双非院校且自己四年间没有学到什么专业方面的技能, 阅读详情

相关推荐

游戏资源解包神器NSCB实战:手把手教你提取Switch游戏视频(nsm转MP4)

本文详细介绍了如何使用NSCB工具链从Switch游戏中提取nsm视频和hca音频资源,并将其转换为可编辑的MP4和MP3格式。通过NSC Builder、CriPakTools等工具的分步操作指南,帮助内容创作者高效获取游戏资源,同时提供音视频同步合成、批量处理等高级技巧,为创意素材制作提供完整解决方案。

weixin_29197835的博客 887

Java的Bean转换工具类

【代码】Java的Bean转换工具类。

蒋劲豪的博客 510

Pi0 项目复现及项目问题解决方案(全网抢先发布~)

Pi0 项目复现及项目问题解决方案(全网抢先发布~)

m0_68167062的博客 2261

12种Bean转换

来源:再见 BeanUtils!性能真拉跨! 一、前言 二、性能测试对比 三、12种转换案例 1. get\set 2. json2Json 3. Apache copyProperties 4. Spring copyProperties 5. Bean Mapping 6. Bean Mapping ASM 7. BeanCopier 8. Orika

小强快跑~~ 1423

【干货】S7-PLCSIM Advanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound)问题解决方法

【干货】S7-PLCSIM Adavanced V3.0 无法启动实例( Error Code:-30,LicenseNotFound)问题解决方法

handinvv的博客 5万+

Apache Paimon-实时数据湖

Flink社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合,推出新一代的 Streaming Lakehouse 技术,促进数据在数据湖上真正实时流动起来,并为用户提供实时离线一体化的开发体验。Flink 社区内部孵化了 Flink Table Store (简称 FTS )子项目,一个真正面向 Streaming 以及 Realtime的数据湖存储项目。

m0_57307642的博客 2192

编码技巧——Bean转换工具MapStruct

业务开发过程中,经常会遇到各种实体之类的转换,JSON转换,Map转换,属性赋值填充,这里整理几个常用的工具,提升效率。

娜娜米的博客 2117

[AHK]获取通达信软件上的股票代码

PC上的股票交易软件的自动止损、自动下单等功能比较弱,不如期货交易软件。 自力更生,程序员都是自己打造工具。 根据IPO模型(Input 输入,Process处理,Output输出),为了方便自动化首先要获取当前交易软件上浏览的股票代码。 截图再OCR显然太麻烦,通过Winspy工具查看下交易软件自带功能的消息号(33780),大家记住这个号码! 下面在用AutoHotkey作为变成语...

liuyukuan的专栏 1万+

MapStruct超级简单的学习笔记

MapStruct使用MapStruct1.MapStruct是用来做什么的?2.使用MapStruct解决上述问题3.添加默认方法4. 可以使用abstract class来代替接口5.可以使用多个参数5.直接使用参数作为属性值 使用MapStruct 首先来了解一下DTO,DTO简单的理解就是做数据传输对象的,类似于VO,但是VO用于传输到前端。(~~) 1.MapStruct是用来做什么的?...

qq122516902的博客 3万+

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5404

【26美赛E题 Passive Solar Shading】2026美赛数学建模(MCM/ICM)思路解析及代码分享

本文研究了被动太阳能遮阳(PSS)策略在建筑节能中的应用,针对Sungrove大学(低纬高温)和Borealis大学(高纬寒冷)两种典型气候条件,建立了动态太阳辐射-热平衡模型。通过优化遮阳结构(外檐长度、百叶角度)、窗户布局和内部热质量分布,实现了夏季制冷负荷降低30-40%(Sungrove)和冬季采暖负荷减少15-25%(Borealis)。创新性地采用全天候动态遮阳建模方法,结合热质量优化与储能设计,提出了可适应不同气候条件的建筑节能解决方案,为未来可持续建筑设计提供了量化框架。

一键难忘的博客 947

使用 BULL 转换Java Bean

前言 BULL(Bean Utils Light Library)是一个Java-bean-to-Java-bean转换器,它将数据从一个对象递归复制到另一个对象。 特点:通用,灵活,可重用,可配置,速度极快。能够在没有任何配置的情况下转换Mutable,Immutable和Mixed bean的库。 1. Dependencies <dependency> ...

湖人•总冠军 1387

5、基于模型的系统工程(MBSE)全面解析

本文全面解析了基于模型的系统工程(MBSE),介绍了模型在系统工程中的核心地位,以及如何通过视图和符号表示法实现信息的可视化。文章还详细阐述了MBSE的方法构成,包括框架(本体和视图点)和流程集,探讨了MBSE的实施流程、关键要素、应用策略以及未来发展趋势。通过合理应用MBSE,组织可以提高系统开发的效率和质量,降低成本与风险,实现成功部署。

nft7creator的博客 127

BULL:Java Bean 转换的利器

BULL:Java Bean 转换的利器 项目介绍 BULL(Bean Utils Light Library)是一款强大的 Java Bean 转换工具,能够递归地将数据从一个 Java Bean 复制到另一个 Java Bean。它具有通用性、灵活性、可重用性、可配置性,并且速度极快。BULL 是唯一能够无需任何自定义配置即可转换可变、不可变和混合 Bean 的库。 项目技术分析 BULL 的...

gitblog_00035的博客 713

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java bean 转bean_如何用Bull转换任意类型的Java Bean

Bull(Bean Utils Light Library)是一个将数据从一个对象递归地复制到另一个对象的Java-bean到Javabean转换器。它是通用的,灵活的,可重用的,可配置的,而且非常快。它是唯一能够在没有任何自定义配置的情况下转换可变、不可变和混合bean的库。本文介绍了如何使用它,并给出了每个可用特性的具体示例。1.依赖性com.hotels.beansbull-bean-tra...

weixin_29796279的博客 706

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

java getbean不同实现_如何用Bull转换任意类型的Java Bean

Bull(Bean Utils Light Library)是一个将数据从一个对象递归地复制到另一个对象的Java-bean到Javabean转换器。它是通用的,灵活的,可重用的,可配置的,而且非常快。它是唯一能够在没有任何自定义配置的情况下转换可变、不可变和混合bean的库。本文介绍了如何使用它,并给出了每个可用特性的具体示例。1.依赖性com.hotels.beansbull-bean-tra...

weixin_39754915的博客 114

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

bfs expedia_Expedia如何摆脱Java Bean变压器

bfs expedia 重要要点 为创新投入一些工作时间可能会鼓励开发人员表达自己的潜力,创建对日常活动有用的解决方案 使开放源代码,解决常见问题的产品或解决方案可以帮助其他人 激情是优质软件的关键要素 BULL可有效加快开发阶段,同时减少引入错误的可能性 在实际情况下,BULL不会导致任何性能下降 在分层体系结构中,通过封装对特定数据对象的更改并将这些更改传播...

cunfu6353的博客 215

Bean转换工具MapStruct看这一篇就够了

mapstruct是一种实体类 映射框架,能够通过Java注解将一个实体类的属性安全地赋值给另一个实体类。它基于约定优于配置方法极大地简化了 Java bean 类型之间映射的实现,有了mapstruct,只需要定义一个映射器接口,声明需要映射的方法,在编译过程中,mapstruct会自动生成该接口的实现类,实现将源对象映射到目标对象的效果。总的来说,有如下三个特点:基于注解在编译期自动生成映射转换代码类型安全、高性能、无依赖性。

zhiyikeji的博客 2770

java中常见的对象转换工具

mapstruct基于注解+字节码生成的方式使用和运行。其支持的功能全面,运行时速度也很快(直接生成转换器类字节码)。@Mapper@Data@Data// 使用复制代码如示例所示,我们只需要定义一个转换器接口,并标记注解@Mapper。UserMapper INSTANCE 添加一个调用单例对象。书写转换方法,当两者的属性名称不一致时,可以添加@Mapping 注解来配置对应关系。其也可以支持列表的转换,这可以说是相当的方便了。

Maisucsdn的博客 765

JAVA Bean对象转换工具

在开发中有些规范,比如DTO、DO、VO等等,之间,如果我们需要转换,单纯的我们要一个一个的 set 值,真是一项苦B的活java bean对象的相关转化,这里介绍两个 ,一个是大家都非常熟悉的 BeanUtils,还有一个就是平常在开发中经常使用的 MapStruct。 MapStruct 和 BeanUtils 最常用的莫过于对象的的拷贝了 。 不过面对需要深拷贝的对象大家要注意了,这里并不推荐大家使用BeanUtils工具去实现 MapStruct 下面重点说一下 MapStruct 这个转化,

一个肥鲇鱼博客 1633

Bean的属性注入

集合实体类 public class CollectionDemo { private List list; private Set set; private Map map; private Properties prop; Car实体类 public class Car { private String name; private double price; Person实体类...

BullZeng的博客 628

bean和实体类转换

@Slf4j public class BeanConvertUtil { public static <T> T convertCopy(Object source, Class<T> tClass) { try { T target = tClass.newInstance(); ...

wjc2013481273的博客 1328

几种Bean映射工具介绍

文章目录一、介绍1、功能介绍2、不同方法与性能对比二、转换案例1、源VO和目标VO2、get/set3、Json2Json4、Spring copyProperties✨5、BeanCopier6、MapStruct✨✨ 一、介绍 1、功能介绍 在 Java 系统工程开发过程中,都会有各个层之间的对象转换,比如 VO、DTO、PO、VO 等,而如果都是手动get、set又太浪费时间,还可能操作错误,所以选择一个自动化工具会更加方便 2、不同方法与性能对比 目前用于对象属性转换有12种,包括普通的get/s

Shawn的个人博客 4139

Bean对象转换工具

需求: 项目当中各层对象经常需要转换,VO、PO、DTO 实现: 1、引入pom依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> <depende

qiaodaima0的博客 590

Java Bean对象互相转换

Java Bean对象互相转换。

蒯厅博客 854

【Spring 笔记】Bean 的类型转换相关整理

【Spring 笔记】Bean 的类型转换相关整理 1. 概述 Bean 对象里面的 属性 类型,都是通过 XML 、Properties 或者其他方式配置的。 Spring 容器加载过程中,这些属性都是以 String 类型加载进容器。 最终再将这些 String 类型的属性转换 Bean 对象属性所对应的真正类型。 这些信息以及转换过程由 Spring 类型转换体系 完成。 ...

qq_43078445的博客 1380
上一篇: idea插件推荐
下一篇: 领域驱动设计实践(4)- 上下文映射图
hamish-wu
博客等级 码龄15年 2814粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值