【问题标题】:Google Java API conflicted with ColdFusion CFHTTP?Google Java API 与 ColdFusion CFHTTP 冲突?
【发布时间】:2015-08-14 01:35:02
【问题描述】:

我尝试将在google-api-client-assembly-1.20.0-1.20.01.zip(从https://developers.google.com/api-client-library/java/google-api-java-client/download 下载)中找到的所有JAR 复制到{cf_root}/lib,重新启动ColdFusion,一切正常。但是,当我使用<cfhttp>

org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [CfmServlet] in context with path [/] threw exception [org.apache.http.impl.client.DefaultHttpClient.setRedirectStrategy(Lorg/apache/http/client/RedirectStrategy;)V] with root cause
java.lang.NoSuchMethodError: org.apache.http.impl.client.DefaultHttpClient.setRedirectStrategy(Lorg/apache/http/client/RedirectStrategy;)V
    at coldfusion.tagext.net.HttpTag.createConnection(HttpTag.java:1728)
    at coldfusion.tagext.net.HttpTag.connHelper(HttpTag.java:928)
    at coldfusion.tagext.net.HttpTag.doEndTag(HttpTag.java:1219)

当我从 {cf_root}/lib 中删除所有 google jar 时,它再次按预期工作。我的解决方法是使用 tokeninfo 端点而不是 com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier,但 Google 建议不要将其用于生产用途。

验证 ID 令牌的最简单方法是使用 tokeninfo 端点。调用此端点涉及额外的网络请求 这会为您完成大部分验证,但会引入一些延迟 以及网络错误的可能性。由于这些原因,它是 仅适用于每月活动少于 100 个的部署 用户,以及用于调试和信息目的。

https://developers.google.com/identity/sign-in/ios/backend-auth

一旦将来自 Google 的 Jar 加载到 ColdFusion 中,是否有任何更好的解决方案可以解决 org.apache.http.impl.client.DefaultHttpClient 的其他问题?

【问题讨论】:

  • 不确定您的总体目标,但您真的需要所有这些罐子吗?我们还需要更多详细信息 A) 哪个/lib 目录 - {cf_root}\lib? B)您删除了哪些罐子?听起来有冲突的是httpclient-4.0.1.jar。删除它应该可以解决那个特定的错误
  • C) 由于您使用的是 CF10,您是否尝试过使用 this.javaSettings 将 jar 加载到您的 application.cfc 中? (显然,如果你这样做,不要将 jars 放在 {cf_root}\lib 或 CF 类路径中的任何其他位置,因为它违背了动态类加载的目的)。
  • B) 您到底删除了哪些 jar? 如果您的意思是您已经删除了 httpclient-4.0.1.jar,那么问题是什么?如果您将所有 jars 放在 CF 类路径中,则使用 google 库应该会自动选择与 CF 捆绑的任何版本的 jar。所以,当罐子被移除时,你还不清楚你遇到了什么问题。你能详细说明一下吗?
  • (编辑)这可能不是唯一的冲突/错误。很多 jar 都很常见,CF 也可以使用,例如commons-logging-1.1.1.jar。您可能不需要所有的罐子,但这取决于您在做什么。看看他们是否有一个依赖列表。如果不是,您可能可以从maven setup 中推断出它。此外,对于笑容,请尝试option "C)"
  • 酷,我不确定。很高兴它起作用了,因为某些库存在无法轻松修复的问题(例如旧版本的 dom4j),即使 使用 动态类加载器也是如此。 Java 版本的 DLL Hell ;-)

标签: coldfusion apache-httpclient-4.x coldfusion-10 google-api-java-client


【解决方案1】:

(来自 cmets)

听起来有冲突的罐子是httpclient-4.0.1.jar。删除它应该可以解决该特定错误。但是,它可能不是唯一的冲突/错误。很多 jar 都很常见,CF 也可以使用,例如commons-logging-1.1.1.jar

由于您使用的是 CF10,您是否尝试过使用新功能 this.javaSettings 在 Application.cfc 中加载 jar?它基本上是Mark Mandel'sJavaLoader.cfc 的翻版。只需指定要加载的 jar 的路径,或检查 jar 的目录,即

THIS.javaSettings = {LoadPaths = [".\folder\",".\folder\someLib.jar"] };

显然,在使用此功能时,不要将 jars 放在{cf_root}\lib或 CF 类路径中的任何其他位置,因为它违背了动态类加载的目的。

【讨论】:

  • 不客气。 FWIW,它之前不起作用的原因是本质上类加载器一次只能加载特定库的单个版本。当您在 CF 类路径中放置多个版本的 same 库(即 Apache HTTPClient 库:httpclient-3.1.2.jar 和 httpclient-4.0.1.jar)时,核心 CF 类加载器将只加载其中之一。如果它加载的版本与您正在执行的任何代码(即 cfhttp)不兼容,则会导致错误。
  • 使用this.javaSettings,通过创建一个完全独立于用于常规CF 代码的类加载器,您可以将所有内容分开。允许 CF 使用它需要的任何 jar 版本(来自其类路径),并且您的应用程序通过创建自己的类路径来使用相同 jar 的不同版本,即您在LoadPaths中指定的目录/jar
猜你喜欢
  • 2014-06-19
  • 2019-11-11
  • 2014-11-06
  • 2013-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多