骡子从有效载荷中获取值
mule getting values from the payload
<flow name="datamappingFlow1" doc:name="datamappingFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="${hostname}" port="${port}" path="account" connector-ref="ConnectorWithoutMuleSession" doc:name="HTTP"/>
<jersey:resources doc:name="REST">
<component class="com.mycompany.qb.rest.AccountMappingService"/>
</jersey:resources>
<object-to-byte-array-transformer doc:name="Object to Byte Array"/>
<byte-array-to-object-transformer doc:name="Byte Array to Object"/>
<scatter-gather doc:name="upsert to db">
<flow-ref name="test1" doc:name="Flow Reference"></flow-ref>
<flow-ref name="test2" doc:name="Flow Reference"></flow-ref>
</scatter-gather>
</flow>
<flow name="test1" doc:name="test1">
<logger message="====Input deduction data is 1======#[payload]" level="INFO" doc:name="Logger"/>
<logger message="==== Input test1 data ======#[message.inboundProperties['City']]" level="INFO" doc:name="Logger"/>
<db:insert config-ref="Oracle_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into test1(City)values(#[payload.City])]]></db:parameterized-query>
</db:insert>
</flow>
<flow name="test2" doc:name="test2">
<logger message="====Input deduction data is 2======#[payload]" level="INFO" doc:name="Logger"/>
<logger message="==== Input test2 data ======#[payload.City]" level="INFO" doc:name="Logger"/>
<db:insert config-ref="Oracle_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into test2(City)values(#[payload.City])]]></db:parameterized-query>
</db:insert>
</flow>
休息组件:
@Path("/")
public class AccountMappingService {
@POST
@Path("/mapping")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String dataMapping(@Payload String content){
log.info("Rest Content is==>\n"+content);
return content;
}
输入数据:
{
"City":"SFO1"
}
输出:
====Input deduction data is 2======{
"City":"SFO1"
}
==== Input test1 data ======null
====Input deduction data is 1======{
"City":"SFO1"
}
==== Input test2 data ======null
为什么我在这里得到空值?
==== Input test1 data ======null
来自:
<logger message="==== Input test1 data ======#[message.inboundProperties['City']]" level="INFO" doc:name="Logger"/>
入站属性由入站端点设置。在您的例子中,您使用的是 HTTP 入站端点。根据 doc:
To keep backward compatibility with previous versions of Mule, the headers and query parameters are also stored plain on the inbound properties.
因此,除非您在发送给流的 HTTP 请求中传递一个 HTTP header 或名为 City
的查询参数,否则 #[message.inboundProperties['City']]
的评估只能 return null
.
案例:
==== Input test2 data ======null
is different. It comes from:
<logger message="==== Input test2 data ======#[payload.City]" level="INFO" doc:name="Logger"/>
这会在无法工作的 String
类型的有效负载上调用 .City
。我推断 payload 的类型是 String
from:
public String dataMapping(@Payload String content)
如果要从中提取值,则需要将 JSON 字符串负载转换为 java.util.Map
。从doc可以看出需要加一个transformer:
<json:json-to-object-transformer returnClass="java.util.Map" />
使用 Java 地图,然后在记录器中使用点操作打印它们,它会起作用。
<flow name="datamappingFlow1" doc:name="datamappingFlow1">
<http:inbound-endpoint exchange-pattern="request-response" host="${hostname}" port="${port}" path="account" connector-ref="ConnectorWithoutMuleSession" doc:name="HTTP"/>
<jersey:resources doc:name="REST">
<component class="com.mycompany.qb.rest.AccountMappingService"/>
</jersey:resources>
<object-to-byte-array-transformer doc:name="Object to Byte Array"/>
<byte-array-to-object-transformer doc:name="Byte Array to Object"/>
<scatter-gather doc:name="upsert to db">
<flow-ref name="test1" doc:name="Flow Reference"></flow-ref>
<flow-ref name="test2" doc:name="Flow Reference"></flow-ref>
</scatter-gather>
</flow>
<flow name="test1" doc:name="test1">
<logger message="====Input deduction data is 1======#[payload]" level="INFO" doc:name="Logger"/>
<logger message="==== Input test1 data ======#[message.inboundProperties['City']]" level="INFO" doc:name="Logger"/>
<db:insert config-ref="Oracle_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into test1(City)values(#[payload.City])]]></db:parameterized-query>
</db:insert>
</flow>
<flow name="test2" doc:name="test2">
<logger message="====Input deduction data is 2======#[payload]" level="INFO" doc:name="Logger"/>
<logger message="==== Input test2 data ======#[payload.City]" level="INFO" doc:name="Logger"/>
<db:insert config-ref="Oracle_Configuration" doc:name="Database">
<db:parameterized-query><![CDATA[insert into test2(City)values(#[payload.City])]]></db:parameterized-query>
</db:insert>
</flow>
休息组件:
@Path("/")
public class AccountMappingService {
@POST
@Path("/mapping")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public String dataMapping(@Payload String content){
log.info("Rest Content is==>\n"+content);
return content;
}
输入数据:
{
"City":"SFO1"
}
输出:
====Input deduction data is 2======{
"City":"SFO1"
}
==== Input test1 data ======null
====Input deduction data is 1======{
"City":"SFO1"
}
==== Input test2 data ======null
为什么我在这里得到空值?
==== Input test1 data ======null
来自:
<logger message="==== Input test1 data ======#[message.inboundProperties['City']]" level="INFO" doc:name="Logger"/>
入站属性由入站端点设置。在您的例子中,您使用的是 HTTP 入站端点。根据 doc:
To keep backward compatibility with previous versions of Mule, the headers and query parameters are also stored plain on the inbound properties.
因此,除非您在发送给流的 HTTP 请求中传递一个 HTTP header 或名为 City
的查询参数,否则 #[message.inboundProperties['City']]
的评估只能 return null
.
案例:
==== Input test2 data ======null is different. It comes from:
<logger message="==== Input test2 data ======#[payload.City]" level="INFO" doc:name="Logger"/>
这会在无法工作的 String
类型的有效负载上调用 .City
。我推断 payload 的类型是 String
from:
public String dataMapping(@Payload String content)
如果要从中提取值,则需要将 JSON 字符串负载转换为 java.util.Map
。从doc可以看出需要加一个transformer:
<json:json-to-object-transformer returnClass="java.util.Map" />
使用 Java 地图,然后在记录器中使用点操作打印它们,它会起作用。