JEXL脚本中对象调用任意方法均返回null的问题排查
JEXL中POJO方法调用返回null/属性访问失败的排查方案
以下是针对你遇到的问题的几种排查方向和解决办法:
检查POJO方法的访问权限
JEXL默认仅能调用public修饰的方法,如果你的getId()方法是private、protected或包级私有,JEXL会无法正常调用并返回null。请确认你的Agent类的getter方法是public权限:public class Agent { private String id; // 必须为public的getter方法 public String getId() { return id; } }排查agentRef是否为动态代理对象
如果agentRef是Spring动态代理、JDK动态代理或CGLIB代理对象,JEXL的反射机制可能无法直接访问目标对象的方法。这种情况下需要先获取代理背后的真实目标对象再放入上下文:// 示例:处理Spring AOP代理的情况 if (AopUtils.isAopProxy(agentRef)) { try { agentRef = ((Advised) agentRef).getTargetSource().getTarget(); } catch (Exception e) { // 处理获取目标对象失败的异常 } } myMap.put("agent", agentRef);调整JEXL引擎的严格模式配置
部分新版本的JEXL默认开启严格模式,会对不符合JavaBean规范的属性访问报错。你可以尝试关闭严格模式,或者确保POJO完全符合JavaBean规范(提供public的getter/setter):JexlEngine je = new JexlBuilder() .namespaces(ns) .strict(false) // 关闭严格模式,允许宽松的属性访问 .create();验证对象类型是否正确
可以在JEXL脚本中先打印对象的类名,确认你操作的是目标POJO而非其他代理或包装类:{ Print:println(agent.getClass().getName()); const x = agent.getId(); Print:println(x); return true; }如果输出的类名包含
$Proxy、CGLIB等代理标识,就需要按第二点的方法处理代理问题。
内容的提问来源于stack exchange,提问作者Rinke
相关产品推荐
相关产品推荐

