Connector中groovy脚本映射如何使用

最后更新:2022-01-11

1. 能解决的问题

Connerctor系统映射模版功能用于应用系统的数据格式和目标系统的数据格式进行映射。即将两个应用系统有相同属性但内容命名不同的字段信息进行关联,通过关联的方式两个字段进行一一对接。目前属性与属性之间的值是直接对应的。例如:来源系统中的性别字段是male,那目标系统得到的值也是male。

这时,可以使用字段映射规则中的groovy脚本映射功能,来实现对来源字段值的转换、拼接、截取等处理操作,把处理结果映射给目标字段,实现在不定制化代码的情况下,灵活地完成字段转换。

映射配置

2. 脚本代码说明

脚本代码的主体为下,实际的处理逻辑,在以下代码块中进行以下步骤修改,即可完成最基础的字段转换:

  1. 填入来源的字段值,这个字段值与使用“一对一映射”时需要填的值保持一致即可。如:externalId(用户唯一id)

  2. 在TODO的下面,完成对来源值result的转换操作,比如转换后值为result1

  3. 把转换后的值,填入到代码块中对应的位置中

//获取来源对象某个属性的值
Object result =  attributeGetter.getAttribute(source, "这里填来源参数名称")
if (null != result) {
    LOG.info("source data {}", result)
    //TODO 在这里进行字段值的处理
    //String result1 = result;

    //对目标对象赋新的值
    attributeSetter.setAttribute(target, mapping.getTargetFiledName(), "这里填转换后的值")
}

以上脚本代码中,主要有以下几个参数,这些参数无需导入类,可以直接使用。以下对各个参数进行说明

  • LOG (日志打印,用于打印日志使用)

  • source (来源对象,从来源获取到的一条用户/组织/组数据,具体数据结构以及属性,由各自的来源插件决定)

  • target (目标对象,最终推送给目标的一条数据,在此段代码中无需关心具体情况)

  • attributeGetter (来源对象属性的Get接口,使用该接口获取来源对象中某个属性的值)

  • attributeSetter (目标对象属性的set接口,使用该接口对目标对象,按属性映射关系进行赋值)

  • mapping (来源和目标之间,同步的属性映射关系)

若以上默认的参数无法满足,需要自主引入(import)其他参数,对于引入的java类,需要找来源插件对应的开发人员进行确认具体位置。在下面案例3中会有使用场景。

LOG 仅在版本号大于等于4.17的connector中能使用,低于此版本的,需要手动引入java类,代码如下

import com.idsmanager.idp.sync.utils.GroovyUtil
import org.slf4j.Logger
import org.slf4j.LoggerFactory
Logger LOG = LoggerFactory.getLogger(GroovyUtil.class)

3. 场景案例

以下通过一些案例,来对上述的代码进行补充

  1. 对钉钉来源的用户,用户唯一id前拼接”dingding_”,来进行标识。

Object result =  attributeGetter.getAttribute(source, "externalId")
if (null != result) {
    LOG.info("source data {}", result)
    attributeSetter.setAttribute(target, mapping.getTargetFiledName(), "dingding_"+result)
}

修改映射后的结果: 映射结果

  1. 对钉钉来源的用户,所有的所属组织前,都拼接”dingding_”,来进行标识。

Object result =  attributeGetter.getAttribute(source, "belongs")
if (null != result) {
    LOG.info("source data {}", result)
	List<String> belongs = new ArrayList<>()
	for(String belong: result){
        belongs.add("dingding_" + belong)
    } 
    attributeSetter.setAttribute(target, mapping.getTargetFiledName(), belongs)
}
  1. 对钉钉来源的用户,所有的所属组织前,都拼接”dingding_”,来进行标识,但是所属组织id来自其他的参数

用户所属的组织id,需要从参数”beOUs”中取出来,而”beOUs”是 List<Belongs> 类型,这时就需要导入对应的Belongs.java类,如下代码的第一行

Object result =  attributeGetter.getAttribute(source, "belongs")
if (null != result) {
    LOG.info("source data {}", result)
	List<String> belongs = new ArrayList<>()
	for(String belong: result){
        belongs.add("dingding_" + belong)
    } 
    attributeSetter.setAttribute(target, mapping.getTargetFiledName(), belongs)
}
  1. 把两个字段拼接成一个字段,映射到一个目标字段中。

Object selfVarSix = attributeGetter.getAttribute(source, "selfVarSix")
Object office = attributeGetter.getAttribute(source, "office")
if (null != selfVarSix) {
    attributeSetter.setAttribute(target, mapping.getTargetFiledName(), selfVarSix + office)  
}

若场景任然无法满足需求,请联系相关开发人员进行评估,寻找解决方案。