Liferay 7 - Freemarker:解包操作与函数签名不匹配

Liferay 7 - Freemarker: unwrap operation not matching the function signature

我在使用 Freemarker 和 classloader 时遇到了一个奇怪的问题,我在 6.2 上没有使用过。 基本上,模板顶部有一个使用 Oauth 的次要逻辑。这用于工作正常,我看不出有什么问题。我尝试在所有可能的地方放置一个 Scribe 的变体,甚至删除了 ROOT 中的那个。

奇怪的是代码在抛出异常之前成功调用了一些方法,我想那不是classloader的问题而是unwrap操作的问题。该功能有什么变化吗?

代码: ${callbackParameters.add(TrueNTHOAuthConstants.REDIRECT, portalUtil.getCurrentCompleteURL(请求))}<br> <#assign trueNTHConnectLoginURL = trueNTHConnect.getAuthorizationUrl(companyId,1, callbackParameters) /> (此行异常)

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)

我刚才提到了 classloader,因为我不得不处理几个 ClassNotFoundException 或 class 未找到的定义来达到这一点。由于库复制,这在某种程度上是意料之中的(不可预测的行为)。

您可能有两个不同的 class 加载了 org.scribe.model.ParameterList 名称。所以 trueNTHConnect 使用了另一个版本的有问题的 class 而不是之前调用的方法。 JVM 会将它们视为完全不同的不兼容 classes,因此没有匹配的重载。

有一个确定的方法可以找到它:在打印 class 名称的地方调试或修改 FreeMarker,以便它也打印 Class 对象的身份哈希。