调用 Java 个 JAR 函数
Calling Java JAR functions
我正在尝试连接到 Java (JAR) 库以与 "QuickBooks Merchant Services API".
进行通信
每次调用 API 都需要一个 OAuth2 访问令牌。我的第一步是使用 QuickBooks 提供的 Java SDK 来获取访问令牌。
我从该页面下载了 "jar-with-dependencies.jar" 选项。根据 Maven,6.0.1 是当前版本。
https://search.maven.org/search?q=a:oauth2-platform-api
我在网站的根目录下创建了一个名为 "java" 的文件夹,并将此文件存储在该文件夹中。
oauth2-platform-api-6.0.1-jar-with-dependencies.jar
在Application.cfc中,我添加了这行代码:
<!--- Application.cfc snippet --->
<cfset this['javaSettings'] = {
LoadPaths = ["#expandPath('/java')#"]
,loadColdFusionClassPath = true
,reloadOnChange = true
,watchInterval = 100
,watchExtensions = "jar,class,xml"
}>
在一个 test.cfm 文件中,我在函数中有以下代码行:
variables['oauth2Config'] = createObject("java", "com.intuit.oauth2.config.OAuth2Config").OAuth2ConfigBuilder(arguments.clientId, arguments.clientSecret).callDiscoveryAPI(Environment.SANDBOX).buildConfig();
在 developer.intuit.com 网站上的示例中,Java 代码如下所示:
OAuth2Config oauth2Config = new OAuth2Config.OAuth2ConfigBuilder("clientId", "clientSecret").callDiscoveryAPI(Environment.SANDBOX).buildConfig();
当我 运行 代码时,我收到以下错误消息。
Class not found: com.intuit.oauth2.config.OAuth2Config
我已将 "LoadPaths" 键换成几个不同的变体,但都导致相同的错误。
LoadPaths = ["/java"]
LoadPaths = ["./java"]
LoadPaths = ["./java/oauth2-platform-api-6.0.1-jar-with-dependencies.jar"]
我试过修改初始化调用:
local['oauth2Config'] = createObject("java", "OAuth2Config").OAuth2ConfigBuilder(arguments.clientId, arguments.clientSecret).callDiscoveryAPI(Environment.SANDBOX).buildConfig();
这导致了基本上相同类型的错误:
Class not found: OAuth2Config
我很确定我在 Application.cfc 中的 this.javaSettings 结构中做错了什么。我希望 Java JAR 方法会更简单,但我最终可能会使用 Intuit 拥有的 REST API。我仍然必须使用 OAuth2,我不确定 cfoauth tag/function 是否适用于该系统。
如果你看到任何可以帮助我解决这个问题的东西,请告诉我。
CF 找不到 OAuth2ConfigBuilder
因为它是内部的 class,这需要稍微不同的语法:
createObject("java", "com.intuit.oauth2.config.OAuth2Config$OAuth2ConfigBuilder");
Environment
也是 jar 中的一个 class。您必须在使用常量 Environment.SANDBOX
之前创建对它的引用
即使在解决了这些问题之后,由于在自定义 jar 中包含 slf4j,使用 CF2016 进行的简短测试仍会抛出 LinkageError,同时还从 CF/lib
加载 jar (也包括 slf4j)。切换到 loadColdFusionClassPath = false
似乎可以解决该错误。
java.lang.LinkageError: loader constraint violation: when resolving
method
"org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;"
the class loader (instance of
coldfusion/runtime/java/JavaDynamicClassLoader)
...
Application.cfc
this['javaSettings'] = {
LoadPaths = ["#expandPath('/java')#"]
,loadColdFusionClassPath = false
, ...
};
代码:
variables['environ'] = createObject("java", "com.intuit.oauth2.config.Environment");
variables['builder'] = createObject("java", "com.intuit.oauth2.config.OAuth2Config$OAuth2ConfigBuilder");
variables['oauth2Config'] = variables['builder'].init( arguments.clientId, arguments.clientSecret).
callDiscoveryAPI( variables['environ'].SANDBOX ).buildConfig();
我正在尝试连接到 Java (JAR) 库以与 "QuickBooks Merchant Services API".
进行通信每次调用 API 都需要一个 OAuth2 访问令牌。我的第一步是使用 QuickBooks 提供的 Java SDK 来获取访问令牌。
我从该页面下载了 "jar-with-dependencies.jar" 选项。根据 Maven,6.0.1 是当前版本。
https://search.maven.org/search?q=a:oauth2-platform-api
我在网站的根目录下创建了一个名为 "java" 的文件夹,并将此文件存储在该文件夹中。
oauth2-platform-api-6.0.1-jar-with-dependencies.jar
在Application.cfc中,我添加了这行代码:
<!--- Application.cfc snippet --->
<cfset this['javaSettings'] = {
LoadPaths = ["#expandPath('/java')#"]
,loadColdFusionClassPath = true
,reloadOnChange = true
,watchInterval = 100
,watchExtensions = "jar,class,xml"
}>
在一个 test.cfm 文件中,我在函数中有以下代码行:
variables['oauth2Config'] = createObject("java", "com.intuit.oauth2.config.OAuth2Config").OAuth2ConfigBuilder(arguments.clientId, arguments.clientSecret).callDiscoveryAPI(Environment.SANDBOX).buildConfig();
在 developer.intuit.com 网站上的示例中,Java 代码如下所示:
OAuth2Config oauth2Config = new OAuth2Config.OAuth2ConfigBuilder("clientId", "clientSecret").callDiscoveryAPI(Environment.SANDBOX).buildConfig();
当我 运行 代码时,我收到以下错误消息。
Class not found: com.intuit.oauth2.config.OAuth2Config
我已将 "LoadPaths" 键换成几个不同的变体,但都导致相同的错误。
LoadPaths = ["/java"]
LoadPaths = ["./java"]
LoadPaths = ["./java/oauth2-platform-api-6.0.1-jar-with-dependencies.jar"]
我试过修改初始化调用:
local['oauth2Config'] = createObject("java", "OAuth2Config").OAuth2ConfigBuilder(arguments.clientId, arguments.clientSecret).callDiscoveryAPI(Environment.SANDBOX).buildConfig();
这导致了基本上相同类型的错误:
Class not found: OAuth2Config
我很确定我在 Application.cfc 中的 this.javaSettings 结构中做错了什么。我希望 Java JAR 方法会更简单,但我最终可能会使用 Intuit 拥有的 REST API。我仍然必须使用 OAuth2,我不确定 cfoauth tag/function 是否适用于该系统。
如果你看到任何可以帮助我解决这个问题的东西,请告诉我。
CF 找不到
OAuth2ConfigBuilder
因为它是内部的 class,这需要稍微不同的语法:createObject("java", "com.intuit.oauth2.config.OAuth2Config$OAuth2ConfigBuilder");
Environment
也是 jar 中的一个 class。您必须在使用常量Environment.SANDBOX
之前创建对它的引用
即使在解决了这些问题之后,由于在自定义 jar 中包含 slf4j,使用 CF2016 进行的简短测试仍会抛出 LinkageError,同时还从
CF/lib
加载 jar (也包括 slf4j)。切换到loadColdFusionClassPath = false
似乎可以解决该错误。java.lang.LinkageError: loader constraint violation: when resolving method "org.slf4j.impl.StaticLoggerBinder.getLoggerFactory()Lorg/slf4j/ILoggerFactory;" the class loader (instance of coldfusion/runtime/java/JavaDynamicClassLoader) ...
Application.cfc
this['javaSettings'] = {
LoadPaths = ["#expandPath('/java')#"]
,loadColdFusionClassPath = false
, ...
};
代码:
variables['environ'] = createObject("java", "com.intuit.oauth2.config.Environment");
variables['builder'] = createObject("java", "com.intuit.oauth2.config.OAuth2Config$OAuth2ConfigBuilder");
variables['oauth2Config'] = variables['builder'].init( arguments.clientId, arguments.clientSecret).
callDiscoveryAPI( variables['environ'].SANDBOX ).buildConfig();