从自定义转换器访问Mule全局变量

时间:2014-10-10 04:26:06

标签: java mule

如何从自定义变换器访问Mule全局变量? 我有一个变量(在属性文件中),名为blaze.services.address - 它肯定被加载(我在MEL中使用它)。我的代码:

import org.mule.api.MuleContext;
import org.mule.api.MuleMessage;
import org.mule.api.context.MuleContextAware;
import org.mule.api.transformer.TransformerException;
import org.mule.api.transport.PropertyScope;
import org.mule.transformer.AbstractMessageTransformer;
import org.apache.commons.httpclient.HttpStatus;
import com.vatit.blaze.esb.exception.HttpResponseException;

public class HttpErrorResponseChecker extends AbstractMessageTransformer {

    @Override
    public Object transformMessage(MuleMessage message, String outputEncoding) throws TransformerException {
        Integer statusCode = Integer.parseInt((String)message.getProperty("http.status", PropertyScope.INBOUND));
        String payload;
            try {
                payload = message.getPayloadAsString();
            } catch (Exception e) {
                e.printStackTrace();  
                payload = "Unknown payload";
            }


        muleContext.getRegistry().get("blaze.services.address");
        if (statusCode >= HttpStatus.SC_BAD_REQUEST)
            throw new HttpResponseException(this, statusCode, "Exception caused by call to HTTP service", payload);

        return message.getPayload();
    }

}

问题

setMuleContext永远不会在断点上停止(从不调用?) muleContext.getRegistry().get("blaze.services.address")返回null

有人有想法吗?

EDIT(变压器配置):

在回应David的评论时,我删除了MuleContextAware的重复实现,但结果仍然相同。

我的变压器配置如下所示:

<custom-transformer class="com.vatit.blaze.esb.transformer.HttpErrorResponseChecker" name="HttpErrorResponseChecker" doc:name="Java">
    <spring:property name="blazeServicesAddress" value="${blaze.services.address}"/>
</custom-transformer>

哪个有效(_blazeServicesAddress属性未在java代码中显示),但我更喜欢直接访问该属性,而不必注入。

编辑2(属性占位符): 这是加载属性文件的方式:

<spring:beans>
    <context:property-placeholder location="classpath:blazedefault.properties" order="0"/>
    <context:property-placeholder  location="classpath:blazeoverride.properties" ignore-resource-not-found="true" ignore-unresolvable="true" order="-1"/>
</spring:beans>

1 个答案:

答案 0 :(得分:1)

AbstractMessageTransformer已经实施MuleContextAware,您可以在此处看到:https://www.mulesoft.org/docs/site/current3/apidocs/org/mule/transformer/AbstractMessageTransformer.html

因此,您可以从自定义转换器中删除对它的支持,只需使用来自此处的muleContext受保护字段:https://github.com/mulesoft/mule/blob/bfb3a17263d1e4b32ee10272cbf710a2bf41b16b/core/src/main/java/org/mule/transformer/AbstractTransformer.java#L58

编辑:事实上,执行您想要实现的目标的正确方法是从Mule XML配置中将blaze.services.address Spring注入HttpErrorResponseChecker,而不是查找它以编程方式完成。