入参映射param_mapping

入参映射是针对当接入参数与实际路由服务所需参数名称不匹配、或缺失参数值等,用来转换接入和接出参数和添加默认参数。 映射后得到的报文被作为新的报文体转发给对应的服务。 参数映射按功能分为两大部分:

  • 对整体报文做映射 mapping字段用于对报文做整体映射 要注意的是一旦配置了mapping字段, 则只保留在mapping中配置的字段 适用于报文的层级转换, 大量的字段需要重组等 另要注意在mapping重组过程中, 获取的值可以来自报文体和上下文
  • 对单个字段做操作 operation字段用于对报文做单个字段的处理 相比参数映射更加灵活和有针对性, 可以对字段做任何特殊处理 在某些场景中只需要对某个报文的一个或几个字段做处理, 则可以不使用mapping 支持自定义扩展operation, 自定义扩展时, 需要将 type设置为custom, functionType为spi标识 两种功能可以分开也可以结合使用,如果同时配置了两种功能则先执行mapping, 再执行operation.另支持对指定operation做特殊配置, 达到在mapping前执行的目的。

例如有如下报文需要做参数映射:

{
    "loanNo":"1501752227749",
    "pageNo":"1",
    "cooprProdCd":"5",
    "txTm":"5650",
    "receiveMg": {
        "acctBch":"636","bussBch":"2128","chnlTxNo":"63","cooprNo":"123456"
    },
    "applyNo": [{"eacNo":666666, chnlTxNo:888888}, {"eacNo":11111, chnlTxNo: 22222}], 
    "tranEndDt":"2017-10-10","tranStartDt":"20170101", 
    "transCode":"RESS_QM10015", 
    "respDesc": "查询实账户余额信息成功"
}

有如下需求:

  • 去掉 (receiveMg), 使"receiveMg"下面的数据合并到最外层, 并删除其中的(cooprNo),
  • 增加字段(bizContent.bchCde), 值为 2020
  • 增加一个固定字段(pathNo), 值为" "
  • 删除字段 (cooprProdCd)
  • 修改 (tranEndDt) 字段的日志格式
  • 增加当前时间 (curDt) 字段, 按照指定的日期格式
  • 将 (tranStartDt) 字段的值映射到字段 (tranStartDttttt)
  • 根据上下文修改 (txTm)字段的值
  • 校验 (loanNo) 字段是否为空
  • 单独获取(applyNo)中第二个对象的(eacNo) 值以新的key (lalala.eacNumber)放入报文体中
  • 将applyNo字段和值都映射, 映射为 "applyNooooo": [{"eacccccNo":666666, chnlTxxxxxNo:888888}, {"eacccccNo":11111, chnlTxxxxxNo: 22222}],
  • 组装一个新的字段(feeAmount), 值来源于transCode和respDesc, 值最终要组装成 transCode + respDesc

组装后的报文为:

{
"loanNo":"1501752227749","pageNo":"1","cooprProdCd":"5","txTm":"5650","receiveMg":     
    {
        "acctBch":"636","bussBch":"2128","chnlTxNo":"63","cooprNo":"123456"
    },
"applyNo": [{"eacNo":666666, "chnlTxNo":888888}, {"eacNo":11111, "chnlTxNo": 22222}], 
"tranEndDt":"2017-10-10","tranStartDt":"20170101", 
"transCode":"RESS_QM10015", 
"respDesc": "查询实账户余额信息成功",
}

配置如下:

 param_mapping:
   available: true
   matcher: '${localPort}->5080'      #只有handler级别的matcher先通过匹配,后面的controller才能生效
   values:
   - available: true
     id: ttt
     matcher: '${localPort}->5080'
     mapping:
       loanNo: 'loanNo'
       pageNo: 'pageNo'
       txTm: 'txTm'
       #pageNumber: 'pageNumber'              #对应----4 ,这个字段现在是注释掉的,不生效, 当然不配置也可以, 重组后的报文都不会包含这个字段
       acctBch: 'receiveMg.acctBch'           #对应----1   
       bussBch: '2128'
       chnlTxNo: 'chnlTxNo'
       transCode: 'transCode'
       respDesc: 'respDesc'
       pathNo: ''                             #对应----3   
       bizContent.bchCde: '{<2020>}'          #对应----2
       tranEndDt: 'tranEndDt'
       tranStartDttttt: 'tranStartDt'         #对应----7
       lalala.eacNumber: 'applyNo[2].eacNo'   #对应----10

       applyNooooo[*].eacccccNo: 'applyNo[*].eacNo'         #对应----11
       applyNooooo[*].chnlTxxxxxNo: 'applyNo[*].chnlTxNo'   #对应----11

     operations:
     - {type: modify, key: tranEndDt, functionType: groovy, expression: 'value.replace("-", "")'}       #对应----5
     - {type: add, key: curDt, functionType: date, expression: 'yyyyMMddHHmmss'}                        #对应----6

     #对应----8  代表操作: 从上下文或报文体中获取aaa对应的值, 赋予txTm.另外利用mapping也可以达到同样效果, 比如在mapping中配置txTm: 'aaa'
     - {type: modify, key: txTm, functionType: default, expression: '${aaa}'}    

     - {type: verify, key: loanNo, functionType: required, expression: null}                             #对应----9

     #下面groovy操作时会从上下文获取 feeAmount 字段对应的值, 连同报文体都传给groovy脚本, feeAmount 字段对应的值对应的key为 'value'
     - {type: add, key: feeAmount, functionType: groovy, expression: 'transCode + respDesc'}            #对应----12
 注意事项
 对于要映射嵌套list的情况配置方式例如: bOrgIdList[*].functionListA[*].aaa: 'applyNo[*].eacNo.sceneTypeList[*].bbb', 
 需要注意的是要保证两边[*]的数量一致, 
 另外对于某些特定场景如向List每个对象中添加固定字段, 配置例如: reply.returnCode[*].d[*].q: '{<8888>}', 
 该配置将会将所有对象的q字段的值替换为8888.
 也可以只映射list对象而非list中每个对象的字段,如 bOrgIdList[*].functionListA[*]: 'applyNo[*].eacNo.sceneTypeList[*]', 
 或者bOrgIdList[*].functionListA: 'applyNo[*].eacNo.sceneTypeList'

出参映射outparam_mapping

功能和配置与入参映射一致, 区别是入参映射在请求进入网关后对报文做处理, 出参映射时在服务端响应到网关后 , 对响应报文做处理

outparam_mapping:
  available: true
  matcher: '${pathNo}->1285 && ${nlinkService}->IPAYTOCOCAndPFfillNLINK && ${TrxCtgy}->0113 && ${RPFlg}->2'
  skipWhenExceptionOccur: false
  clearPayloadWhenExceptionOccur: true
  values:

- id: outparam_mapping_epcc_RZZFSK_IPAYTOCOCAndPFfillNLINK
  available: true
  mapping: !!omap
  - root.MsgBody.SysRtnInf.SysRtnCd: 'sysRtnCd'
  - root.MsgBody.SysRtnInf.SysRtnDesc: 'sysRtnMsg'
  - root.MsgBody.SysRtnInf.SysRtnTm: 'respTime'
  - root.MsgBody.BizInf.RPFlg: 'orgReqRoot.MsgBody.TrxInf.RPFlg'
  - root.MsgBody.BizInf.TrxStatus: 'status'
  - root.MsgBody.BizInf.TrxFinishTm: 'respTime'
  - root.MsgBody.BizInf.BatchId: 'orgReqRoot.MsgBody.TrxInf.BatchId'
  - root.MsgBody.BizInf.CdtrBankId: 'payeeSeq'
  - root.MsgBody.BizInf.BizStsCd: 'respCode'
  - root.MsgBody.BizInf.BizStsDesc: 'respMsg'
  - root.MsgBody.BizInf.TrxCtgy: 'orgReqRoot.MsgBody.TrxInf.TrxCtgy'
  - root.MsgBody.BizInf.TrxId: 'orgReqRoot.MsgBody.TrxInf.TrxId'
  - root.MsgBody.BizInf.TrxAmt: 'orgReqRoot.MsgBody.TrxInf.TrxAmt'
  - root.TrxIdTemp: 'orgReqRoot.MsgBody.TrxInf.TrxId'
    operations:
  - {type: custom, key: root.MsgBody.SysRtnInf.SysRtnTm, functionType: iso_datetime, expression: 'NOW_IF_EMPTY'}
  - {type: custom, key: root.MsgBody.BizInf.TrxFinishTm, functionType: iso_datetime, expression: 'NOW_IF_EMPTY'}
  - {type: custom, matcher: '${Epcc_Is_Success_Return}->0 && ${root.MsgBody.BizInf.BizStsCd}->null', key: root.MsgBody.BizInf.BizStsCd, functionType: groovy, expression: '"00000000"'}
  - {type: custom, matcher: '${Epcc_Is_Success_Return}->0 && ${root.MsgBody.BizInf.BizStsDesc}->null', key: root.MsgBody.BizInf.BizStsDesc, functionType: groovy, expression: '"交易成功"'}
  - {type: modify, matcher: '${Epcc_Is_Success_Return}->0 && ${root.MsgBody.BizInf.CdtrBankId}->null', key: root.MsgBody.BizInf.CdtrBankId, functionType: default, expression: 'root.TrxIdTemp'}
Copyright © 民生科技有限公司 2019 all right reserved,powered by Gitbook联系方式: wanglihang@mskj.com
修订时间: 2019-09-03 17:48:17

results matching ""

    No results matching ""