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

标签 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

有人有想法吗?

编辑(变压器配置):

作为对 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 代码中显示),但我更愿意直接访问该属性,而不必注入(inject)。

编辑 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>

最佳答案

AbstractMessageTransformer 已经实现了 MuleContextAware,如您所见:https://www.mulesoft.org/docs/site/current3/apidocs/org/mule/transformer/AbstractMessageTransformer.html

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

编辑:事实上,实现您想实现的目标的正确方法是将 blaze.services.address 注入(inject) HttpErrorResponseChecker 来自 Mule XML 配置,而不是像那样以编程方式查找它。

关于java - 从自定义转换器访问 Mule 全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26291931/

相关文章:

java - Mule 信任库和 keystore

mule - Dataweave 1.0 将项目添加到数组

java - 添加从文本文件读取的 double

使用 JFileChooser 进行 Java 键绑定(bind)

java - FileOutputStream 和 DataOutput Stream 的问题

stored-procedures - 如何在 Mule 3.5 批处理中使用存储过程

java - Mule 集合聚合器未返回正确的 List 序列

java - 如何在 Java 中使用替换来交换反斜杠和双引号的空格

java - 隐藏或删除 REST Web 服务中的路径

java - 如何通过 Mule HTTP 监听器获取准确的特殊字符