骡子:Pojo中的访问字段如何从JSON到对象

时间:2014-02-12 12:52:58

标签: mule mule-studio mule-el

我构建了Mule项目,它通过HTTPComponent接收JSON并传递给object。 我的问题是在转换对象时无法访问字段。

My flux的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]

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

<json:object-to-json-transformer/>

答案 1 :(得分: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的类。从有效负载获取事务代码并设置重写方法以返回string

类型的对象
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)然后我通过添加Object to String组件来终止流程,或者如果您希望将JSON对象返回给用户,则将Object放置到JSON组件。