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 对象的身份哈希。
我在使用 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 对象的身份哈希。