调用 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 是否适用于该系统。

如果你看到任何可以帮助我解决这个问题的东西,请告诉我。

  1. CF 找不到 OAuth2ConfigBuilder 因为它是内部的 class,这需要稍微不同的语法:

    createObject("java", "com.intuit.oauth2.config.OAuth2Config$OAuth2ConfigBuilder");
    
  2. Environment 也是 jar 中的一个 class。您必须在使用常量 Environment.SANDBOX

  3. 之前创建对它的引用
  4. 即使在解决了这些问题之后,由于在自定义 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();