wso2 esb json在使用预定转发消息处理器时缺少引号和括号

时间:2016-07-12 06:53:36

标签: json wso2 activemq wso2esb

我在通过esb和activemq发送json请求时遇到问题,实际上我正在使用代理,我用rest和json内容调用我的代理。这是我的集成流程,我调用代理(带邮递员),代理将请求(带有json内容)发送到jms消息存储,然后,我定义了一个调度转发消息处理器来使用来自消息存储的消息并将它们发送到定义的端点(.net web api)。但问题是数字字符串会自动转换为整数元素:“age”:100(我希望它是字符串“age”:“100”),另一个问题是json单个元素数组更改为json中的字符串属性, “list”:[“salam”]更改为“list”:“salam”,似乎有些东西正在删除括号但是如果我发送一个包含多个元素的数组它可以正常工作,但是当我直接从代理发送请求时到我的终点(不使用消息代理)它正常工作。(在所有状态esb控制台正确记录json消息,我认为预定的消息转发处理器正在做这个改变),我之前问过两个问题,由于@krishan回答我昨天的question,我更新了我的axis2.xml文件并添加了JsonStreamFormatter和JsonStreamBuilder,就像他说的那样,但没有任何反应。

这是我的代理人:

<?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
       name="myProxy"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log level="full"/>
         <property name="FORCE_SC_ACCEPTED" value="true" scope="axis2"/>
         <property name="OUT_ONLY" value="true"/>
         <property name="messageType" value="application/json" scope="axis2"/>
         <store messageStore="myProxyMS"/>
      </inSequence>
   </target>
   <description/>
</proxy>

我的jms消息存储:

<messageStore name="myProxyMS" class="org.apache.synapse.message.store.impl.jms.JmsStore" xmlns="http://ws.apache.org/ns/synapse">
   <parameter name="java.naming.factory.initial">org.apache.activemq.jndi.ActiveMQInitialContextFactory</parameter>
   <parameter name="java.naming.provider.url">tcp://localhost:61616</parameter>
   <parameter name="store.jms.username">admin</parameter>
   <parameter name="store.jms.password">admin</parameter>
   <parameter name="store.jms.JMSSpecVersion">1.1</parameter>
   <parameter name="store.producer.guaranteed.delivery.enable">false</parameter>
   <parameter name="store.failover.message.store.name">InfoGetMobileIndMS</parameter>
</messageStore>

预定转发消息处理器:

<messageProcessor name="myProxyMP" class="org.apache.synapse.message.processor.impl.forwarder.ScheduledMessageForwardingProcessor" targetEndpoint="aspnet" messageStore="myProxyMS" xmlns="http://ws.apache.org/ns/synapse">
   <parameter name="interval">1000</parameter>
   <parameter name="client.retry.interval">1000</parameter>
   <parameter name="max.delivery.attempts">4</parameter>
   <parameter name="is.active">true</parameter>
   <parameter name="max.delivery.drop">Enabled</parameter>
   <parameter name="member.count">1</parameter>
</messageProcessor>

邮差json请求:

{
    "name" : "farzam",
    "lastname" : "vatanzadeh",
    "age" : "1000",
    "nested" : {
        "id" : "cd12334dasc",
        "group" : "asd",
        "list" : ["salam"]
    }
}

enter image description here

我的.NET api

 [HttpPost]
    [Route("proxy")]
    [Test]
    public HttpResponseMessage Proxy(TempViewModel model)
    {
        return Request.CreateResponse(HttpStatusCode.Accepted);
    }
    public class TempViewModel
    {
        public string name { get; set; }
        public string lastname { get; set; }
        public string age { get; set; }
        public Nested nested { get; set; }
    }
    public class Nested
    {
        public string id { get; set; }
        public string group { get; set; }
        public List<string> list { get; set; }
    }

我定义了一个actionFilter属性来捕获从消息处理器发送到我的api的http post请求以打开它的内容。 我的Json请求变成这样:

{
    "name":"farzam",
    "lastname":"vatanzadeh",
    "age":1000,
    "nested":{
        "id":"cd12334dasc",
        "group":"asd",
        "list":"salam"
    }
}

我正在努力解决这个问题超过10天,我非常感谢WSO2的工程师,如果他们能帮助我解决它:(

1 个答案:

答案 0 :(得分:0)

这是由于ESB中使用的STAXON消息格式化程序而发生的。无论如何,我不能依赖于使用采样消息处理器可以正常工作的说法。由于转发和采样消息处理器都使用相同的格式化器。如果在格式化消息时列表中有一个元素,它将显示为一个元素。但是如果列表中有多个元素,那么它将显示为列表。为此,我们向生产客户发布了补丁。很遗憾,我们不能在像这样的公共论坛中发布补丁。如果您需要这样的解决方案,请尝试从WSO2获取生产支持。