Connector groovy脚本使用文档¶
最后更新:2023-02-02
背景¶
connector 在做字段映射时,提供了字段一对一映射模式和groovy脚本映射模式,为了方便开发,交付,测试等同学更快,更方便的使用脚本,本文档提供groovy脚本的基本使用方法和脚本示例。
脚本基本元素¶
connector中的groovy脚本,定义了如下所需要使用到的对象:
对象名称 |
对象类型 |
对象作用 |
示例 |
---|---|---|---|
source |
Object |
来源数据的对象,里面存放了来源数据 |
|
target |
TargetDataItem |
目标数据的对象,里面存放了目标数据 |
|
LOG |
Logger |
日志打印对象,可以进行日志打印输出 |
LOG.info(“[{}] - 打印测试”,RIDHolder.id()); |
attributeGetter |
AttributeGetter |
来源数据对象的属性获取类,可以从该对象调用getAttribute(SourceDataItem item, String attributeName)方法获取对象的特定属性值 |
attributeGetter.getAttribute(source,“userName”); |
attributeSetter |
AttributeSetter |
目标数据对象的属性设置类,可以从该对象调用setAttribute(TargetDataItem item, String attributeName, Object… attributeValue)方法把属性值赋值进去。 |
attributeSetter.setAttribute(target, mapping.getTargetFiledName(), “123”)); |
mapping |
SyncFieldMapping |
属性映射的对象,该对象存放了同步任务里面所配置的属性映射字段。 |
mapping.getTargetFiledName(); |
脚本创建步骤¶
获取所需要的来源属性值,如下:
import java.lang.String
//获取来源对象的用户名
String userName = attributeGetter.getAttribute(source,"userName")
source为来源数据的对象,不用修改。
userName为来源对象的用户名的属性名称。
注意:当使用到脚本基本元素里面没有定义的对象时,需要使用import 导入进来。比如String对象,需要在文件最前面添加import java.lang.String;
对来源数据的属性值进行逻辑处理,根据业务需求,进行不同的代码逻辑处理,比如需要在用户名前面加上固定的前缀,如下:
import java.lang.String
//获取来源对象的用户名
String userName = attributeGetter.getAttribute(source,"userName")
//添加固定前缀
userName = "test_" + userName
把转换之后的来源属性值设置到目标数据对象里面去。
import java.lang.String
import com.idsmanager.micro.commons.web.filter.RIDHolder
//获取来源对象的用户名
String userName = attributeGetter.getAttribute(source,"userName")
//添加固定前缀
userName = "test_" + userName
LOG.info("[{}] - new username is :{}", RIDHolder.id(), userName)
//把转换过后的值赋值到目标数据对象里面
attributeSetter.setAttribute(target, mapping.getTargetFiledName(), userName)
target为目标数据的对象,不用修改。
mapping.getTargetFiledName() 该方法用于获取目标数据对象的属性名称。
userName为需要设置的具体值。
脚本使用示例¶
需求:从IDP4拉取数据同步到钉钉里面,IDP4的手机号是phoneNumber字段,手机区号是phoneRegion字段,同步到钉钉的手机号字段是mobile,钉钉没有手机区号字段,国际手机号的格式为+xx-xxxxxx。需要把IDP4的phoneNumber和phoneRegion拼接成+xx-xxxxxx的格式。
groovy脚本如下:
import java.lang.String
//获取IDP4的手机号
String phoneNumber = attributeGetter.getAttribute(source,"phoneNumber")
//获取IDP4的手机区号
String phoneRegion = attributeGetter.getAttribute(source,"phoneRegion")
//组装成+xx-xxxxxx的格式
String newMobile = "+" + phoneRegion + "-" + phoneNumber
//给钉钉目标数据对象赋值
attributeSetter.setAttribute(target, mapping.getTargetFiledName(), newMobile)
需求:从IDP4同步组到钉钉,需要把IDP4组里面用户名为admin的过滤掉。
groovy脚本如下:
import java.lang.String
import java.util.List
import com.idsmanager.idp.sync.core.idp4.entity.IDP4Member
//获取组名
List<IDP4Member> members = attributeGetter.getAttribute(source,"members")
//过滤掉组名为默认组的数据
Iterator<IDP4Member> it = members.iterator()
while(it.hasNext()){
IDP4Member member = it.next()
if("admin".equals(member.getUsername())){
it.remove()
}
}
attributeSetter.setAttribute(target, mapping.getTargetFiledName(),members)
注意事项¶
在实际项目中,特别是生产环境,虽然可以方便的调用应用中的bean或者类的方法,但随意调用也可能引发不可避免的灾难,所以对groovy动态脚本需要进行严格的测试。