从官网copy:
OGNL调用方法的方式与 Java 的方式略有不同,因为 OGNL是被解释的并且必须在运行时选择正确的方法,除了提供的实际参数之外没有额外的类型信息。OGNL总是选择它可以找到的最具体的方法,其类型与提供的参数匹配;如果有两个或多个同样具体且与给定参数匹配的方法,则将任意选择其中一个。
特别是,空参数匹配所有非原始类型,因此最有可能导致调用意外的方法。
请注意,方法的参数由逗号分隔,因此除非将逗号括在括号中,否则不能使用逗号运算符.
调用类方法的时候,格式为:${@类的全路径@方法名(args)}
那如果是简单的方法,如,没有参数,和一两个参数就比较好解决。
那如果是集合或者数组呢?
我定义了一个这样的类的方法来处理:
public class Handle{ public static String handle(String ... args){ ... } }
我的xml原本是这么写的:
select *,${@com.zkj.utils.Handle@handle("1","2")} from t_user where username like '%${namePart}%'
但是这样不行,提示参数不匹配,需要将参数转为数组才行。
那这里就很奇怪了,如果我这样做,是可以的:
select *,${@com.zkj.utils.Handle@handle(@java.util.Arrays@asList("'1'","'2'"))} from t_user where username like '%${namePart}%'
就是说,如果改写handle里面的参数,将参数类型改为list,则可以成功执行。
但是,这里asList里面的参数,依然是T... args这样的类型的,都是这种格式,我定义的却不能成功。
由于项目里别的地方也用了这个方法,为了防止对其他人进行干扰,所以我又定义了一个split方法:
public static String[] split(String arg){ return arg.split(","); }
那这样就可以这么用:
select *,${@com.zkj.utils.Handle@handle(@com.zkj.utils.Handle@split("'1','2'"))} from t_user where username like '%${namePart}%'
这样就可以解决这个问题了。
那有人问我,能不能直接定义数组,传过去呢?
我之前试了好多次,如:new String[]{"1","2"}, new java.lang.String[]{"1","2"},{"1","2"},["1","2"]
所有的这些格式,都提示格式或者语法有误。
如果读者有更简单的方式,还请告诉我,谢谢