JOLT中基于输入属性调用Java方法并条件赋值的配置问题排查与实现咨询
JOLT中基于输入属性调用Java方法并条件赋值的配置问题排查与实现咨询
我来帮你分析这个JOLT配置的问题,同时聊聊怎么实现你的目标需求。
首先先明确下场景:
你的输入JSON是这样的:
{ "clause": { "typeClause": "CLAUSE_TYPE", "codeClause": "CL03" } }
先说说为什么第一种配置能正常工作
你这套JOLT转换是可以得到预期输出的:
[ { "operation": "com.kapia.kaway.penelop.jolt.Transco", "spec": { "clause": { "texte": "=stubToGetSecondParameter('CL03','lorem ipsum')" } } }, { "operation": "shift", "spec": { "clause": { "typeClause": { "CLAUSE_TYPE": { "@(2,texte)": "clause.texte" } } } } } ]
对应的输出符合预期:
{ "clause": { "texte": "lorem ipsum" } }
原因很简单:
- 第一步
Transco操作直接在clause层级下生成了texte字段,值是Java方法的返回结果; - 第二步
shift操作里,@(2,texte)是从当前的typeClause.CLAUSE_TYPE节点向上回溯两层(回到clause节点),拿到已经生成的texte值,再赋值给目标路径。
再说说第二种配置为什么失效
下面这套配置就达不到效果了:
[ { "operation": "com.kapia.kaway.penelop.jolt.Transco", "spec": { "clause": { "typeClause": { "CLAUSE_TYPE": { "texte": "=stubToGetSecondParameter('CL03','lorem ipsum')" } } } } }, { "operation": "shift", "spec": { "clause": { "typeClause": { "CLAUSE_TYPE": { "@(0,texte)": "clause.texte" } } } } } ]
问题出在结构冲突和路径识别上:
- 输入里的
typeClause是字符串类型的值CLAUSE_TYPE,但你在Transco操作里把它改成了对象类型,里面嵌套了texte字段; - JOLT处理时,原始的字符串值和你生成的对象结构会产生冲突,后续
shift操作里的@(0,texte)根本找不到对应的节点——因为此时typeClause的结构已经混乱了,既不是原始的字符串,也不是你期望的完整对象。
实现你的目标需求的建议
你的核心需求是:根据输入的typeClause值做条件判断,调用Java方法存结果,再用同样的条件把结果映射到目标路径,可以这么调整配置:
第一步:用Transco生成临时变量,避免结构冲突
把Java方法的返回值放到一个临时层级(比如temp),不要和输入的原始clause结构混在一起,同时动态传入输入里的codeClause值(不用硬编码CL03):
{ "operation": "com.kapia.kaway.penelop.jolt.Transco", "spec": { "clause": { "typeClause": { "CLAUSE_TYPE": { "@(1,codeClause)": "=stubToGetSecondParameter(@(1,codeClause),'lorem ipsum') -> temp.texte" } } } } }
这里@(1,codeClause)是向上取一层的codeClause值,确保能动态获取输入里的codeClause参数传给Java方法。
第二步:用shift做条件映射
根据typeClause的值,把临时变量里的结果映射到目标路径,同时保留原始的clause字段:
{ "operation": "shift", "spec": { "temp": { "texte": { "@(2,clause.typeClause)": { "CLAUSE_TYPE": { "$": "clause.texte" } } } }, "clause": { "*": "clause.&" } } }
这个配置的逻辑是:
- 先判断
clause.typeClause的值是否为CLAUSE_TYPE; - 如果是,就把
temp.texte的值赋值给clause.texte; - 最后把原始
clause里的所有字段都保留下来。
另外要注意:请确保你的自定义Transco操作支持解析@(1,codeClause)这种JOLT路径表达式,能正确把输入的参数传递给Java方法。
备注:内容来源于stack exchange,提问作者gbouget
相关产品推荐
相关产品推荐

