在骡子恩里彻如何访问骡子消息



我想在不更改负载的情况下从http请求中检索请求上下文,所以我使用了enricher,但似乎enricher不能是MuleMessage?我得到以下错误:

org.mule.model.resolvers.EntryPointNotFoundException: Failed to find entry point for component, the following resolvers tried but failed: [
CallableEntryPointResolver: Object "com.ict.cos.transformer.RequestContextBuilder@53dc8cb8" does not implement required interface "interface org.mule.api.lifecycle.Callable"
MethodHeaderPropertyEntryPointResolver: The required property "method" is not set on the event
ReflectionEntryPointResolver: Could not find entry point on: "com.ict.cos.transformer.RequestContextBuilder" with arguments: "{class org.apache.commons.httpclient.ContentLengthInputStream}"
AnnotatedEntryPointResolver: Component: com.ict.cos.transformer.RequestContextBuilder@53dc8cb8 doesn't have any annotated methods, skipping.
]

我的配置:

<enricher source="#[message]" target="#[flowVars['requestContext']]" doc:name="Message Enricher">
    <component doc:name="Build request context">
        <spring-object bean="requestContextBuilder"/>
    </component>
</enricher>

requestContextBuilder:

public class RequestContextBuilder {
    public RequestContext build(MuleMessage message) {
        RequestContext requestContext = new RequestContext();
        requestContext.setMethod(RESTMethod.get((String) message.getInboundProperty("http.method")));
        requestContext.setAPI((String) message.getInboundProperty("http.request.path"));
        requestContext.setQueryParams((String) message.getInboundProperty("http.query.string"));
        return requestContext;
    }
}

我认为你不能传入Message,所以我会为你想添加到富集中的每个头值设置多个富集器。

默认情况下,有效载荷将作为源传递给浓缩

例如

<flow name="orderProcessingFlow">
<inbound-endpoint ref="orderEndpoint"/>
<enricher>
<authorizenet:authorize cardNumber="/order/cc/number" />
<enrich target="#[header:paymentValidated]" source="/authorizenet/authorization/@valid" />
<enrich target="#[header:paymentAuthCode]" source="/authorizenet/authorization/code"/>
</enricher>
<outbound-endpoint ref="orderStep2"/>
</flow>

希望能有所帮助!

如异常所示,尝试更改组件以使其实现org.mule.api.lifecycle.Callable,您将收到一个MuleEvent。

代码中的一些小更改将完成所需的工作。

首先修改组件类以实现Mule的可调用接口

public class RequestContextBuilder implements Callable {
    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception { 
        MuleMessage message = eventcontext.getMessage();
        RequestContext requestContext = new RequestContext();
        requestContext.setMethod(RESTMethod.get((String) message.getInboundProperty("http.method")));
        requestContext.setAPI((String) message.getInboundProperty("http.request.path"));
        requestContext.setQueryParams((String) message.getInboundProperty("http.query.string"));
        return requestContext;
    }    
}

然后修改enricher,将payload(这里是requestContext)设置为flowVariable。

<enricher source="#[payload]" target="#[flowVars['requestContext']]" doc:name="Message Enricher">
    <component doc:name="Build request context">
        <spring-object bean="requestContextBuilder"/>
    </component>
</enricher>

希望这能有所帮助。

最新更新