Xpath base64Decode 在 Wso2Esb 4.8.1 中不起作用

Xpath base64Decode not working in Wso2Esb 4.8.1

我收到一个需要解码的 base64 流。 我正在做一些研究,但我被卡住了,这是我的代码:

<outSequence>
     <property name="cadena" value="Hola mundo" scope="default" type="STRING"/>
     <property name="cadena64"
               expression="base64Encode(get-property('cadena'))"
               scope="default"
               type="STRING"/>
     <property 
               name="cadenaASCII"
               expression="syn:base64Decode(syn:get-property('cadena64'))"
               scope="default"
               type="STRING"/>
     <payloadFactory media-type="json">
        <format>
          {"cadena":"",
            "cadena64":"",
            "cadenaASCII":"",
          }
        </format>
        <args>
           <arg evaluator="xml" expression="get-property('cadena')"/>
           <arg evaluator="xml" expression="get-property('cadena64')"/>
           <arg evaluator="xml" expression="get-property('cadenaASCII')"/>
        </args>
     </payloadFactory>
     <send/>
  </outSequence>

我通过取消注释行启用了 Xpath 2.0

synapse.xpath.dom.failover.enabled=true

位于 $ESB_HOME/repository/conf 目录(并重新启动服务)。

这是我得到的错误:

Evaluation of the XPath expression syn:base64Decode(syn:get-property('cadena64')) resulted in an error  More TID[-1234] [ESB] [2019-03-04 19:27:23,359] ERROR {org.apache.synapse.util.xpath.SynapseXPath} - Evaluation of the XPath expression syn:base64Decode(syn:get-property('cadena64')) resulted in an error net.sf.saxon.xpath.XPathEvaluator.compile(XPathEvaluator.java:378) org.apache.synapse.util.xpath.SynapseXPath.evaluateDOMXPath(SynapseXPath.java:529) org.apache.synapse.util.xpath.SynapseXPath.stringValueOf(SynapseXPath.java:364) org.apache.synapse.mediators.builtin.PropertyMediator.getResultValue(PropertyMediator.java:302) org.apache.synapse.mediators.builtin.PropertyMediator.mediate(PropertyMediator.java:96) org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:77) org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:47) org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:131) org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:268) org.apache.synapse.core.axis2.SynapseCallbackReceiver.handleMessage(SynapseCallbackReceiver.java:488) org.apache.synapse.core.axis2.SynapseCallbackReceiver.receive(SynapseCallbackReceiver.java:170) org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:180) org.apache.synapse.transport.passthru.ClientWorker.run(ClientWorker.java:225) org.apache.axis2.transport.base.threads.NativeWorkerPool.run(NativeWorkerPool.java:172) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) java.lang.Thread.run(Thread.java:745) 

您引用的错误包含格式错误的堆栈跟踪:

Evaluation of the XPath expression syn:base64Decode(syn:get-property('cadena64')) resulted in an error  
More TID[-1234] [ESB] [2019-03-04 19:27:23,359] ERROR {org.apache.synapse.util.xpath.SynapseXPath} - 
Evaluation of the XPath expression syn:base64Decode(syn:get-property('cadena64')) resulted in an error 
net.sf.saxon.xpath.XPathEvaluator.compile(XPathEvaluator.java:378) 
org.apache.synapse.util.xpath.SynapseXPath.evaluateDOMXPath(SynapseXPath.java:529) 
....

这给了我们一些信息,但没有我们想要的那么多。它告诉我们 XPath 表达式正在由 Saxon 求值,并且它告诉我们 Saxon 正在报告表达式中的静态错误。它还告诉我们这是一个相当旧的 Saxon 版本,因为至少在 Saxon 9.6 之后的版本中,class XPathEvaluator 包含大约 330 行。它没有告诉我们错误实际上是什么。

糟糕的诊断似乎是 Apache 突触的责任。

恐怕这只是回答问题的一小步,但我希望这些信息对某人有用。

你的代码在 ESB 5.0.0 中工作,所以没有帮助(但升级可以解决你的问题!) 我发现它怀疑 Encode 正在工作而 Decode 没有。没有 base64Decode 没有 syn: 你能试试吗?

我认为在 4.8.1 中只有编码是 supported/implemented 否则如前所述,一个选项是升级 esb。以下内容在 4.8.1

中对我有用
   <property name="contentBase64" expression="//t:Content" scope="default" type="STRING"/>

<script language="js"><![CDATA[importPackage(Packages.org.apache.commons.codec.binary); var log = mc.getServiceLog();      log.info("1");var c = mc.getProperty("contentBase64");log.info("2:"+c);var bc = Base64.decodeBase64(c);log.info("3:"+bc);  var result = "";  for(var i = 0; i                                                                                                                               
                                             < bc.length; ++i){     result+= (String.fromCharCode(bc[i]));  }   log.info("result:"+result);      mc.setProperty("contentDecoded", result);]]></script>

解码后的内容可以在属性"contentDecoded".

中访问

希望对您有所帮助。