gpt4 book ai didi

clojure - 无法调用非公共(public)类的公共(public)方法: public (Google gcloud library)

转载 作者:行者123 更新时间:2023-12-03 03:12:34 34 4
gpt4 key购买 nike

我正在尝试使用 gcloud图书馆。

(ns firengine.state
(:import
[com.google.cloud AuthCredentials]
[com.google.cloud.datastore DatastoreOptions]))

(-> (DatastoreOptions/builder)
(.projectId "<project_id>")
(.authCredentials
(AuthCredentials/createForJson
(clojure.java.io/input-stream service-account-path)))
.build)

上面的clojure代码翻译自following code snippet (省略,单击“在其他地方运行”)。

import com.google.cloud.AuthCredentials;
import com.google.cloud.datastore.DatastoreOptions;

DatastoreOptions options = DatastoreOptions.builder()
.projectId(PROJECT_ID)
.authCredentials(AuthCredentials.createForJson(
new FileInputStream(PATH_TO_JSON_KEY))).build();

当我从 Clojure REPL 调用此代码时,出现以下错误。

Unhandled java.lang.IllegalArgumentException
Can't call public method of non-public class: public
com.google.cloud.ServiceOptions$Builder
com.google.cloud.ServiceOptions$Builder.projectId(java.lang.String)

Reflector.java: 88 clojure.lang.Reflector/invokeMatchingMethod
Reflector.java: 28 clojure.lang.Reflector/invokeInstanceMethod
boot.user4590132375374459695.clj: 168 firengine.state/eval17529
boot.user4590132375374459695.clj: 167 firengine.state/eval17529
Compiler.java: 6927 clojure.lang.Compiler/eval
... elided ...

com.google.cloud.datastore.DatastoreOptions 代码 can be found here .

2016 年 6 月 29 日更新:根据Schlomi根据下面的建议,我想也许如果我 AOT 围绕 DatastoreOptions 编译了自己的包装器,它就会起作用。

(ns firengine.datastore
(:import
[com.google.cloud AuthCredentials]
[com.google.cloud.datastore Datastore DatastoreOptions Entity Key KeyFactory])
(:gen-class
:state state
:init init
:constructors {[String String] []}))

(defn -init
[^String project-id ^String service-account-path]
(let [service-account (clojure.java.io/input-stream service-account-path)
credentials (AuthCredentials/createForJson service-account)
dsoptions (-> (DatastoreOptions/builder)
(.projectId project-id)
(.authCredentials credentials)
.build)]
[[] {:project-id project-id
:service-account-path service-account-path
:datastore-options dsoptions}]))

我修改了我的启动开发任务以包含以下内容:

(deftask development
"Launch Immediate Feedback Development Environment"
[]
(comp
(aot :namespace '#{firengine.datastore})
(repl :port 6800)
(reload)
(watch)
(cljs)
(target :dir #{"target"})))

我尝试像这样构造对象:

(def service-account-path (System/getenv "FIRENGINE_SERVICE_ACCOUNT_PATH"))

(def project-id (System/getenv "PROJECT_ID"))

(def datastore-options (firengine.datastore. project-id service-account-path))

不幸的是,我仍然遇到同样的错误?

    clojure.lang.Compiler$CompilerException: java.lang.reflect.InvocationTargetException, compiling:(state.clj:15:1)
java.lang.reflect.InvocationTargetException:
java.lang.IllegalArgumentException: Can't call public method of non-public class: public com.google.cloud.ServiceOptions$Builder com.google.cloud.ServiceOptions$Builder.projectId(java.lang.String)

我真的没有编译firengine.datastore吗?

最佳答案

是的....这个问题。你可能不会相信,但它实际上是一个 open bug in the jdk来自...等等...1999!

您可以在clojure jira中阅读更多内容。以及 google groups .

您可能必须制作自己的 java 包装器以避免这种情况,或者 ask the library author考虑到这个古老的已知 java bug。

如果您不想编写自己的 java 包装器,并且作者坚持认为“这是最好的设计,就像有史以来!”,那么您始终可以通过使用 (.setAccessible 设置方法可访问性来强制它方法 true) 和一些更多的自定义反射代码..

祝你好运!

关于clojure - 无法调用非公共(public)类的公共(public)方法: public (Google gcloud library),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059977/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com