Liferay 7 - Freemarker:解包操作与函数签名不匹配
Posted
技术标签:
【中文标题】Liferay 7 - Freemarker:解包操作与函数签名不匹配【英文标题】:Liferay 7 - Freemarker: unwrap operation not matching the function signature 【发布时间】:2016-07-13 12:49:37 【问题描述】:我在使用 Freemarker 和我在 6.2 上没有的类加载器时遇到了一个奇怪的问题。 基本上,模板顶部有一个使用 Oauth 的小逻辑。这个用得很好,我看不出有什么问题。我尝试在任何地方放置 Scribe 的变体,甚至删除 ROOT 中的那个。
奇怪的是代码在抛出异常之前成功调用了一些方法,我猜那不是类加载器问题,而是解包操作的问题。该功能有什么变化吗?
代码:
$callbackParameters.add(TrueNTHOAuthConstants.REDIRECT, portalUtil.getCurrentCompleteURL(request))
<#assign trueNTHConnectLoginURL = trueNTHConnect.getAuthorizationUrl(companyId,1, callbackParameters) /> (Exception at this line)
FreeMarker template error:
No compatible overloaded variation was found; can't convert (unwrap) the 3rd argument to the desired Java type.
The FTL type of the argument values were: number (wrapper: f.t.SimpleNumber), number (wrapper: f.t.SimpleNumber), extended_hash+string (org.scribe.model.ParameterList wrapped into f.e.b.StringModel).
**The matching overload was searched among these members**:
com.sun.proxy.$Proxy799.getAuthorizationUrl(long),
com.sun.proxy.$Proxy799.getAuthorizationUrl(long, int, org.scribe.model.ParameterList, org.scribe.model.ParameterList),
com.sun.proxy.$Proxy799.getAuthorizationUrl(long, int, org.scribe.model.ParameterList)
我刚刚提到了类加载器,因为我必须处理几个未找到的 ClassNotFoundException 或类定义才能到达这一点。由于库复制,这是某种预期的(不可预测的行为)..
【问题讨论】:
您是否有可能使用org.scribe.model.ParameterList
名称加载了两个不同的类?因为展开第三个参数是一个非常微不足道的案例。这个领域的最后一个重要变化是在 2.3.21 (2014-10-12),虽然它不应该导致像这样的回归。
我怀疑是这种情况,因为我遇到了类定义问题而不是找不到类。但是现在所有异常都消失了,如果是这种情况,分配之前的方法也会失败,对吗?
正如我从失败的模板中看到的那样,trueNTHConnect
可能使用了另一个版本的有问题的类,而不是之前调用的方法。无论如何,有一个确定的方法可以找到它:在打印类名的地方修改 FreeMarker,以便它也打印 Class
对象的身份哈希。
@ddekany 很抱歉很长时间,我在这里浏览问题,我注意到这个问题被标记为未回答。如果你愿意,你可以输入一个答案..它解决了这个问题。
我已将此添加为答案。
【参考方案1】:
您可能有两个使用org.scribe.model.ParameterList
名称加载的不同类。所以trueNTHConnect
使用了另一个版本的问题类,而不是之前调用的方法。 JVM 会将它们视为完全不同的不兼容类,因此没有匹配的重载。
有一个确定的方法可以找到它:在打印类名的地方调试或修改 FreeMarker,以便它也打印类对象的身份哈希。
【讨论】:
以上是关于Liferay 7 - Freemarker:解包操作与函数签名不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Liferay 7 - 列出模板 FreeMarker 中的所有博客
使用 freemarker 构建 Liferay 7 巨型菜单(多级菜单)
如何获得可重复的文本字段 liferay7 Freemarker 之一