使用Velocity中的数组参数调用java方法

使用Velocity中的数组参数调用java方法,java,arrays,methods,liferay,velocity,Java,Arrays,Methods,Liferay,Velocity,我正在编写一个velocity模板文件(.vm),在该文件中,我获得了带有反射的类: #set ($assetEntryQuery = $portal.getClass().forName("com.liferay.portlet.asset.service.persistence.AssetEntryQuery").getConstructor().newInstance()) 然后我创建一个数组并调用此函数: #set ($arr = ['$category.getCategoryId()

我正在编写一个velocity模板文件(.vm),在该文件中,我获得了带有反射的类:

#set ($assetEntryQuery = $portal.getClass().forName("com.liferay.portlet.asset.service.persistence.AssetEntryQuery").getConstructor().newInstance())
然后我创建一个数组并调用此函数:

#set ($arr = ['$category.getCategoryId()'])
$assetEntryQuery.setStart(0)
$assetEntryQuery.setEnd(6)
$assetEntryQuery.setAllCategoryIds($arr)

不幸的是,SetAllCategoryId接受一个数组long[],而不是Velocity数组。我在网站上看到的是正在打印的“$assetEntryQuery.SetAllCategoryId($arr)”。你们有谁知道如何使它工作吗?

你们应该删除['$category.getCategoryId()']周围的单引号,这样:[$category.getCategoryId()]

编辑 作为一种黑客和变通方法,这解决了以下问题:

$assetEntryQuery.setAllCategoryIds($category.getCategoryId())

因为velocity在方法中支持varargs(请参见此答案中的注释)。

然后我们应该检查两件事:$category.getCategoryId()是否返回长字符串?Velocity是否使用括号表示法创建长[]数组或对象[]数组,和/或是否尝试将这些数组转换为所需类型。顺便说一句,我从未尝试过liferay,但根据API$category,我在Velocity中有一个很长的XP。getCategoryId()返回一个很长的XP。如何检查Velocity是否创建了long[]或Object[]的数组?好的,我去看了代码,Velocity实际上创建了一个
ArrayList
。从这里开始,我怀疑Velocity introspector是否会尝试将
ArrayList
转换为
long[]
。我觉得这应该作为一个bug报告给Velocity,因为这应该是允许的。我看不出有什么办法可以摆脱这种局面。没有其他方法可供使用吗?@PetarTahchiev我刚想到一件事,您是否尝试直接调用
$asseentryquery.setAllCategoryId($category.getCategoryId())
。Velocity应该处理varargs参数列表,也许这是一个解决方法?但我从未尝试过。@PetarTahchiev您能指出在您的上下文中有什么可用的吗?如果有
ArrayTool
,则很容易解决。