在WSO2中设置属性时,可以通过编程方式创建表达式吗?



我有一个情况,我们接受'JSON'样的代码到API中,有一个情况的问题,其中一个客户有一个数字ID作为字段名。

{
  "Node1": {
     "123456": [
        {
         "Field1": "Value1",
         "Field2": "Value2"
        },
        {
         "Field1": "Value3",
         "Field2": "Value4"
        }
     ]
  }
}

现在,如果我硬编码123456

,尝试将数组设置为属性工作
<property name="fields" expression="json-eval($.Node1.123456)" scope="default" type="STRING"></property> 

但是我需要动态地设置这个表达式。我有一个对所讨论的id的引用作为属性值。

是否可以动态构建一个表达式,以便我可以将此json设置为属性?

ie。就像

 <property name="myid" value="123456"/>
 <property name="fields" expression="fn:concat('json-eval($.Node1.', get-property('myid'))" scope="default" type="STRING"></property>

是否可以将消息转换为XML并以某种方式引用它并转换回json?

谢谢!

可以使用属性中介和脚本中介。

下面是一个例子:

 <property name="payload" expression="json-eval($.)"/>
 <property name="myid" value="123456"/>
 <property name="HARDCODED" value="none"/>
 <script language="js">
    var myid = mc.getProperty("myid");
    // you can interate your payload if needed
    var payload = mc.getProperty("payload");
    // Or just make a String of it  
    var json = '{ "Node1" : { "' + myid + '": [{ "Field1": "Value1", "Field2": "Value2" }] } }';
     mc.setProperty("HARDCODED", json);
 </script>
 <payloadFactory media-type="json">
    <format>$1</format>
    <args>
       <arg evaluator="xml" expression="get-property('HARDCODED')"/>
    </args>
 </payloadFactory>

使用JavaScript,你可以直接进入它。

希望能有所帮助。

我可以通过迂回的方式做到这一点。我必须在消息到达后使用我自己的Mediator修改消息。

在下面的代码中,我只是以第一次出现为例

public class MyMediator extends AbstractMediator { 
  .
  .
  public boolean mediate(MessageContext mc) {
    OMFactory factory = OMAbstractFactory.getOMFactory();
    SOAPBody b = mc.getEnvelope().getBody();
    Iterator it = b.getFirstElement().getChildrenWithLocalName("Node1");
    if(it.hasNext()){
        OMElement obj = (OMElement)it.next();
        Iterator w_it = obj.getChildElements();
        if(w_it.hasNext()){
            OMElement cfield = (OMElement)w_it.next();
            cfield.setLocalName("Order");
            .
            .
        }
       ((OMContainerEx)b).setFirstChild(obj);
     }
  }
  .
  .    
}

然后我可以获取id并使用id创建一个新的OMElement,并将元素重命名为有意义的东西,如'Order'

现在我可以使用json路径引用它并将其设置为属性如:

<property name="fields" expression="json-eval($.Order)" scope="default" type="STRING"></property>

在我的例子中,id也在Order的字段中。所以这对我来说不是问题,但是如果您需要,当您重命名节点时,您可以存储现有的名称(即。通过创建新的OMElement并将其添加到obj

,将12345)作为值。

的'((OMContainerEx)b).setFirstChild(obj);'是可选的。我不关心前面的路径,所以把它们删掉了。

希望这篇文章能帮助到一些人(或者有人能想出一个更好的主意;))

相关内容

  • 没有找到相关文章

最新更新