wso2 esb json 使用计划转发消息处理器时缺少引号和括号
wso2 esb json missing quotes and brackets when using scheduled forwarding message processor
我在通过 esb 和 activemq 发送 json 请求时遇到问题,实际上我正在使用代理,我用 rest 和 json 内容调用我的代理。这是我的集成流程,我调用代理(使用 postman),代理将请求(使用 json 内容)发送到 jms 消息存储,然后,我定义了一个计划转发消息处理器来使用来自消息存储的消息并将它们发送到定义的端点(.net web api)。但问题是带有数字的字符串会自动转换为整数元素:"age": 100(我希望它是字符串 "age": "100"),另一个问题是 json 单元素数组更改 json、"list" 中的字符串属性:["salam"] 更改为 "list":"salam",似乎某些东西正在删除括号,但如果我发送一个包含多个元素的数组,它可以正常工作,但是当我将请求直接从代理发送到我的端点(不使用消息代理)时,它可以正常工作。(在所有状态下,esb 控制台都会正确记录 json 消息,我认为预定的消息转发处理器正在做这个改变),我之前问过两个问题,由于@krishan 对我昨天的 的回答,我更新了我的 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"]
}
}
还有我的 .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工程师能帮我解决,我将不胜感激:(
发生这种情况是因为 ESB 内部使用了 STAXON 消息格式化程序。无论如何,我不能相信这与采样消息处理器一起工作得很好。由于转发和采样消息处理器都使用相同的格式化程序。如果在格式化消息时列表中有一个元素,它将显示为一个元素。但是如果列表中有多个元素,那么它将显示为一个列表。为此,我们已经向生产客户发布了一个补丁。很遗憾,我们无法在 public 论坛中发布这样的补丁。如果您需要这样的解决方案,请尝试从 WSO2 获得生产支持。
我在通过 esb 和 activemq 发送 json 请求时遇到问题,实际上我正在使用代理,我用 rest 和 json 内容调用我的代理。这是我的集成流程,我调用代理(使用 postman),代理将请求(使用 json 内容)发送到 jms 消息存储,然后,我定义了一个计划转发消息处理器来使用来自消息存储的消息并将它们发送到定义的端点(.net web api)。但问题是带有数字的字符串会自动转换为整数元素:"age": 100(我希望它是字符串 "age": "100"),另一个问题是 json 单元素数组更改 json、"list" 中的字符串属性:["salam"] 更改为 "list":"salam",似乎某些东西正在删除括号,但如果我发送一个包含多个元素的数组,它可以正常工作,但是当我将请求直接从代理发送到我的端点(不使用消息代理)时,它可以正常工作。(在所有状态下,esb 控制台都会正确记录 json 消息,我认为预定的消息转发处理器正在做这个改变),我之前问过两个问题,由于@krishan 对我昨天的
这是我的代理:
<?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"]
}
}
还有我的 .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工程师能帮我解决,我将不胜感激:(
发生这种情况是因为 ESB 内部使用了 STAXON 消息格式化程序。无论如何,我不能相信这与采样消息处理器一起工作得很好。由于转发和采样消息处理器都使用相同的格式化程序。如果在格式化消息时列表中有一个元素,它将显示为一个元素。但是如果列表中有多个元素,那么它将显示为一个列表。为此,我们已经向生产客户发布了一个补丁。很遗憾,我们无法在 public 论坛中发布这样的补丁。如果您需要这样的解决方案,请尝试从 WSO2 获得生产支持。