基本流程导致NullPayload

时间:2017-11-13 19:47:33

标签: mule anypoint-studio

我是Mule的新手,我试图从书中获得第一个例子" Mule in Action"工作

我使用的是Mule 3.9和Anypoint Studio 6.4.1。在第1章中,他们描述了我创建的非常基本的product_registration流程,如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:http="http://www.mulesoft.org/schema/mule/http" xmlns:jms="http://www.mulesoft.org/schema/mule/jms" xmlns="http://www.mulesoft.org/schema/mule/core" xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
    xmlns:spring="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core 
http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http 
http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/jms 
http://www.mulesoft.org/schema/mule/jms/current/mule-jms.xsd">
    <http:listener-config name="HTTP_Listener_Configuration" host="0.0.0.0" port="8880" basePath="products" doc:name="HTTP Listener Configuration"/>
    <jms:activemq-connector name="Active_MQ" username="admin" password="admin" brokerURL="tcp://localhost:61616" validateConnections="true" doc:name="Active MQ"/>
    <flow name="product_registrationFlow">
        <http:listener config-ref="HTTP_Listener_Configuration" path="/" doc:name="HTTP"/>
        <logger level="INFO" doc:name="Logger Before"/>
        <byte-array-to-string-transformer doc:name="Byte Array to String"/>
        <logger level="INFO" doc:name="Logger After"/>
        <jms:outbound-endpoint doc:name="JMS" queue="products"/>
    </flow>
</mule>

以及随附的功能测试:

@Test
public void testCanRegisterProducts() throws Exception {

    LocalMuleClient client = muleContext.getClient();

    String productAsJson = "{ \"name\":\"Widget\", \"price\": 9.99, \"weight\": 1.0, \"sku\": \"abcd-56789\" }";

    MuleMessage source = new DefaultMuleMessage(productAsJson, muleContext);
    client.dispatch("http://localhost:8880/products", source);

    MuleMessage result = client.request("jms://products", RECEIVE_TIMEOUT);

    assertNotNull(result);
    assertFalse(result.getPayload() instanceof NullPayload);
    assertEquals(productAsJson, result.getPayloadAsString());
}

当我运行测试时,它在最后一个断言失败,因为实际有效载荷是:

{NullPayload}

如果我直接查看ActiveMQ,我会看到有效负载。如果我手动发布到Mule(使用像Chrome中的Poster这样的工具,只设置标题Content-Type:application / json),则有效负载是有效的JSON,我可以通过测试(因为它正在从中获取待处理的消息)海报发布的队列及其创建的消息位于队列的末尾,有效负载为{NullPayload}。

有人可以从JUnit测试中调用流程失败的原因,但是当使用像Poster这样的工具调用它时似乎有效吗?

更新:在皮埃尔·B的帮助下,我开始工作了。 FunctionalTestCase中MuleMessage的初始化更新如下:

    MuleMessage source = new DefaultMuleMessage(productAsJson, muleContext);
    source.setProperty("Content-Type", "application/json", PropertyScope.INBOUND);
    source.setProperty("Content-Length", Integer.valueOf(productAsJson.length()), PropertyScope.INBOUND);

1 个答案:

答案 0 :(得分:1)

你说当你使用外部工具而不是MuleClient发布消息时它会起作用:

  

使用Chrome中的Poster等工具,只设置标题Content-Type:application / json

尝试向MuleMessage添加相同的标题,例如:

MuleMessage source = new DefaultMuleMessage(productAsJson, muleContext);

# define the headers
Map<String, Object> headers = new HashMap<String, Object>(1);
headers.put("Content-Type", "application/json");
headers.put("Content-Length", sourceLength);

# add the headers as function parameter
client.dispatch("http://localhost:8880/products", source, headers);

编辑:正如@sceaj指出的那样,Content-Type和Content-Length标头都是必需的。