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 之一

Liferay 7 JQuery 下拉 (+) 按钮

Liferay,来自搜索的 Freemarker 错误模板,但不是来自其他链接

带有 freemarker 和 spring 的 Liferay portlet