0

我正在构建通过 HTTPComponent 接收 JSON 并反对的 Mule 项目。我的问题是无法访问对象转换中的字段。

我的通量 XML 是:

<flow name="RestJsonHelloWorldFlow1" doc:name="RestJsonHelloWorldFlow1"><http:inbound-endpointexchange-pattern="request-response" host="localhost" port="8081" path="credit/new" doc:name="HTTP" mimeType="application/json"/> <response> <logger message=" #[message.payload.transactionCode]" level="INFO" doc:name="Logger"/> </response> <json:json-to-object-transformer doc:name="JSON to Object" returnClass="com.creditmobile.domain.Request" name="request"/></flow>

我的pojo是:

@JsonAutoDetect
 public class Request {

private Integer transactionCode;

public Request() {
    super();
}
public Integer getTransactionCode() {
    return transactionCode;
}

我的 JSON 是:

{
 "transactionCode": 1
}

我得到以下异常:

org.mule.api.transformer.TransformerMessagingException: The object transformed is of type: "SimpleDataType{type=java.lang.String, mimeType='*/*'}", but the expected return type is "SimpleDataType{type=org.mule.api.transport.OutputHandler, mimeType='application/json'}". The current MuleMessage is null! Please report this to dev@mule.codehaus.org at org.mule.transformer.AbstractMessageTransformer.checkReturnClass(AbstractMessageTransformer.java:183) at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:162) at org.mule.transformer.AbstractMessageTransformer.transform(AbstractMessageTransformer.java:73) + 3 more (set debug level logging or '-Dmule.verbose.exceptions=true' for everything)

我看到其他有同样问题的主题,但他们没有解决方案,你的建议对我不起作用。

我通过以下方式访问字段:[message.payload.transactionCode]

谢谢。

4

2 回答 2

0

一旦应用程序退出 RestJsonHelloWorldFlow1 流,您实际上想要返回给用户什么?

我认为正如 Anton Kupias 所说,您的问题是标签。我设法通过删除标签来解决异常,并将有效负载转换为恰好在 HTTP 入站端点之后的对象。

配置 XML

<flow name="RestJsonHelloWorldFlow1" doc:name="RestJsonHelloWorldFlow1">
    <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="credit/new"
        doc:name="HTTP" mimeType="application/json" />

    <json:json-to-object-transformer 
        doc:name="JSON to Object" returnClass="com.creditmobile.domain.Request" />

    <component class="com.creditmobile.domain.TransactionResponse" doc:name="Java"/>

    <object-to-string-transformer doc:name="Object to String"/>
</flow>

基本上你有

1) 设置为请求-响应的 HTTP 入站端点

2) 立即将 JSON 转换为 Object

3)然后我创建了一个java组件来执行所需的处理;通过创建一个实现 org.mule.api.lifecycle.Callable 的类。从有效负载中获取事务代码并设置覆盖的方法以返回字符串类型的对象

public class TransactionResponse implements Callable {

@Override
public Object onCall(MuleEventContext eventContext) throws Exception {
    // Type casts payload to object Request
    Request requestObject = (Request) eventContext.getMessage().getPayload();

    int code = Integer.valueOf(requestObject.getTransactionCode());
    String reply = "";

    switch (code) {
    case 1:
        reply = "New";
        break;
    case 2:
        reply = "Delete";
        break;
    }

    return reply;
}

}

4) 然后我通过将对象添加到字符串组件来终止流程,或者如果您希望将 JSON 对象返回给用户,则将对象放置到 JSON 组件。

于 2014-02-12T15:19:55.423 回答
0

我认为您的问题出在 http 响应阶段,而不是访问该字段。当您尝试将 Java 对象作为 http 响应返回时,Mule 会感到困惑。根据您的要求,尝试将返回有效负载设置为在响应阶段更易于理解的内容。例如

<set-payload value="#[payload.transactionCode.toString()]"/> 

或者

<json:object-to-json-transformer/>
于 2014-02-12T14:02:26.297 回答