首页 > 解决方案 > WSO2 EI 过滤介质中的动态正则表达式

问题描述

我已经使用过滤器调解器检查电子邮件主题是否具有特定关键字或不使用正则表达式。

<property value="Test SR AWS onboarding of AWS server" name="emailSubject" scope="default" type="STRING" />

<filter regex=".*SRAWS.*|.*SR AWS.*|.*SRSAP.*|.*SR SAP.*|.*SRFW.*|.*SR FW.*|.*SRSEC.*|.*SR SEC.*|.*INAWS.*|.*INSAP.*|.*INFW.*|.*INSEC.*"
    source="get-property('emailSubject')">

    <then>
        <log level="custom">
            <property name="==Test Case ===" value="pass" />
        </log>

    </then>
    <else>
        <log level="custom">
            <property name="==Test Case ===" value="Fail" />
        </log>
    </else>
</filter>

就我而言,需要大量关键字(超过 60 个)。我在代码中有硬编码的关键字,而不是这个,我试图将这些关键字存储在某个地方(例如localentry)并尝试将主题与这个匹配以使代码成为通用的。

本地入口:

    <?xml version="1.0" encoding="UTF-8"?>
<localEntry key="EmailTicketing_Keyword" xmlns="http://ws.apache.org/ns/synapse">
    <SR>.*SRAWS.*|.*SR AWS.*|.*SRSAP.*|.*SR SAP.*|.*SRFW.*|.*SR FW.*|.*SRSEC.*|.*SR SEC.*</SR>
</localEntry>

从 Localentry 读取:

<property expression="get-property('EmailTicketing_Keyword')" name="tokenconfig" scope="default" type="OM"/>
<property expression="$ctx:tokenconfig//*[local-name()='SR']" name="SR" scope="default" type="STRING"/>

我无法使用上述属性(SR)来匹配过滤器中介者中的主题。

有什么方法可以实现我的用例吗?

PS:将来可能会添加新关键字,为了避免在需要更改关键字时更改代码级别,我只需在 localentry 中添加新关键字而不是代码,因为关键字更改是通用的,这将正常工作,这就是我尝试这个的原因。

标签: regexfilterwso2wso2esbwso2ei

解决方案


您的localEntryas XML 不起作用,因为它以.(dot) 开头,而 wstx 解析器将引发错误。改为LocalEntry用作Text

<localEntry xmlns="http://ws.apache.org/ns/synapse" key="RegTicketing">
.*SRAWS.*|.*SR AWS.*|.*SRSAP.*|.*SR SAP.*|.*SRFW.*|.*SR FW.*|.*SRSEC.*|.*SR 
 SEC.*
</localEntry>

使用它作为正则表达式你需要使用ScriptMediator如下:

<property name="tokenconfig" expression="get-property('RegTicketing')" scope="default" type="STRING"/>
<script language="js">
  var regStr = mc.getProperty('tokenconfig').toString();
  var testStr = mc.getProperty('emailSubject').toString();
  var regExp = new RegExp(regStr);                   
  mc.setProperty('testResult',regExp.test(testStr).toString());
</script>
      

你可以使用testResultFilterMediator

<filter xpath="$ctx:testResult='true'">

推荐阅读