如何从我的自定义转换器访问 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/