简体   繁体   中英

Transforming JSON body using WSO2 class mediator

Following is the log of my current json body. And I want to add new property to this body. "NewPropertyName": "value" . Since the value is in a database I am using a class mediator to add this property.

[2015-05-18 05:47:08,730]  INFO - LogMediator To: /a/create-project, MessageID: urn:uuid:b7b6efa6-5fff-49be-a94a-320cee1d4406, Direction: request, _______BODY_______ = 
{
  "token": "abc123",
  "usertype":"ext",
  "request": "create"
}

Class mediator's mediate method,

public boolean mediate(MessageContext mc) {
        mc.setProperty("key", "vale retrived from db");
        return true;
}

but this doesn't work as I expected. I couldn't find any guide to add property to json body using class mediator, please help.

To inject a property to the body you have to use following code snippet,

JsonUtil.newJsonPayload(
            ((Axis2MessageContext) context).getAxis2MessageContext(),
            transformedJson, true, true);

inside a class mediator. Following is an example of mediate method.

/**
 * Mediate overridden method to set the token property.
 */@Override
public boolean mediate(MessageContext context) {
try {

    // Getting the json payload to string
    String jsonPayloadToString = JsonUtil.jsonPayloadToString(((Axis2MessageContext) context)
        .getAxis2MessageContext());
    // Make a json object
    JSONObject jsonBody = new JSONObject(jsonPayloadToString);

    // Adding the name:nameParam.
    jsonBody.put("name", getNameParam());

    String transformedJson = jsonBody.toString();

    // Setting the new json payload.
    JsonUtil.newJsonPayload(
    ((Axis2MessageContext) context).getAxis2MessageContext(),
    transformedJson, true, true);

    System.out.println("Transformed JSON body:\n" + transformedJson);

} catch (Exception e) {
    System.err.println("Error occurred: " + e);
    return false;
}

return true;
}

You will need json and other libraries for this. This is fully explained in following blog post.

json-support-for-wso2-esb-class-mediator

mc.setProperty is used to create a new property as if you were using property mediator.

If you want to add a new element inside your message, in java, you can handle it as if it were a XML message (for exemple, to get the first element :
OMElement element = (OMElement) context.getEnvelope().getBody().getFirstOMChild(); )

Sample to add a new element with a javascript :

<script language="js"><![CDATA[
    var payloadXML = mc.getPayloadXML();
    payloadXML.appendChild(new XML(<NewPropertyName>value</NewPropertyName>));
    mc.setPayloadXML(payloadXML);
]]></script>

Log the message in XML with <log level="full"> and you get :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Body>
    <jsonObject>
      <token>abc123</token>
      <usertype>ext</usertype>
      <request>create</request>
      <NewPropertyName>value</NewPropertyName>
    </jsonObject>
  </soapenv:Body>
</soapenv:Envelope>

Log the message in JSON with

<log>
  <property name="JSON-Payload" expression="json-eval($.)"/>
</log> 

and you get : JSON-Payload = {"token":"abc123","usertype":"ext","request":"create","NewPropertyName":"value"}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM