如何从类中介外部访问属性?log打印logProperty为null的原因
问题原因与解决方案
为什么打印结果是null?
有两个核心原因:
上下文属性Key匹配错误
你的类中介中,logProperty是类的成员变量,配置文件里通过<property>给它赋值为"log"。在mediate方法里,你执行context.setProperty(logProperty, "result"),实际是往MessageContext中存入了一个**Key为"log"、值为"result"**的属性。但日志中介里用$ctx:logProperty去取值,这个Key在上下文里根本不存在,自然返回null。混淆了类实例属性与上下文属性
类中介的logProperty是类的私有成员属性,属于类实例本身,不属于MessageContext的上下文属性集合。$ctx:前缀只能访问MessageContext中的属性,无法直接读取类内部的成员变量。
如何全局访问类中介的属性?
如果要在MessageContext范围内(也就是后续中介能访问到)获取类中介的logProperty属性值,需要在类中介的mediate方法里主动把这个属性存入MessageContext:
修改后的类中介代码
private String logProperty; public boolean mediate(MessageContext context) { // 将类的logProperty属性存入上下文,自定义Key比如"class_log_property" context.setProperty("class_log_property", this.logProperty); // 原有的属性设置逻辑 context.setProperty(logProperty, "result"); return true; } // 确保getter和setter正确实现 public String getLogProperty() { return logProperty; } public void setLogProperty(String logProperty) { this.logProperty = logProperty; }
修改后的日志中介配置
<log level="full"> <!-- 取类中介存入上下文的属性值 --> <property expression="$ctx:class_log_property" name="Class Mediator's logProperty"/> <!-- 取原逻辑设置的result值 --> <property expression="$ctx:log" name="After Class Mediator"/> </log>
另外要注意:类中介的logProperty成员变量必须有对应的setLogProperty方法,否则配置文件里的<property>无法完成属性注入,类里的logProperty会是null,后续逻辑也会出错。
内容的提问来源于stack exchange,提问作者Some Guy
相关产品推荐
相关产品推荐

