【问题标题】:Xpath base64Decode not working in Wso2Esb 4.8.1Xpath base64Decode 在 Wso2Esb 4.8.1 中不起作用
【发布时间】:2024-04-29 15:20:02
【问题描述】:

我收到一个需要解码的 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":"$1",
            "cadena64":"$2",
            "cadenaASCII":"$3",
          }
        </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$1.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) 

【问题讨论】:

    标签: xpath wso2 base64 wso2esb xpath-2.0


    【解决方案1】:

    我认为在 4.8.1 中仅支持/实现编码,否则如前所述,一个选项是升级 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”属性中访问。

    希望对您有所帮助。

    【讨论】:

    • 谢谢!我期待升级版本,但同时你的代码对我来说很好:)
    【解决方案2】:

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

    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 之后的版本中,XPathEvaluator 类包含大约 330 行。它没有告诉我们的是错误实际上是什么。

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

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

    【讨论】:

    • 感谢您的回答,在发布解决方案之前,我一直在关注这条线索 :)
    【解决方案3】:

    您的代码在 ESB 5.0.0 中工作,因此没有任何帮助(但升级将是您问题的解决方案!) 尽管 Encode 正在工作而 Decode 没有,但我发现它很可疑。不带base64Decode,不带syn:,你能试试吗?

    【讨论】:

      最近更新 更多