为什么 :d b.type/uri 的值返回为 com.cognitect.transit.impl.URIImpl?

Why do values of :db.type/uri return as com.cognitect.transit.impl.URIImpl?

提问人:adham327 提问时间:10/3/2023 最后编辑:adham327 更新时间:10/16/2023 访问量:68

问:

我正在使用 Datomic Cloud,我注意到以下情况,每当我处理该类型的事实并尝试查询它时,我都会返回该类型,我希望类型保持不变。我没有找到关于这个问题或如何处理它的文档。java.net.URIcom.cognitect.transit.impl.URIImpl

这破坏了我使用互操作来获取 URI 主机的行为。由于 Clojure 将抛出一个异常。No matching field found: getHost for class com.cognitect.transit.impl.URIImpl

在 local-dev 中不会发生此问题。

例:

(require '[datomic.client.api :as d])

(def schema [{:db/ident :test/url
              :db/valueType :db.type/uri
              :db/unique :db.unique/identity
              :db/cardinality :db.cardinality/one
              :db/doc "The URL."}])

(def cfg {:server-type :cloud
          :region ""
          :system ""
          :endpoint ""})

(def client (d/client cfg))

(d/create-database client {:db-name "test"})

(def conn (d/connect client {:db-name "test"}))

(d/transact conn {:tx-data schema})

(d/transact conn {:tx-data [{:test/url (java.net.URI. "https://www.google.com")}]})

(let [q '[:find ?url
          :where [?e :test/url ?url]]
      db (d/db conn)]
  (d/q q db))
;; => [[#object[com.cognitect.transit.impl.URIImpl 0x938b85 "https://www.google.com"]]]

(let [q '[:find ?url
          :where [?e :test/url ?url]]
      db (d/db conn)]
  (type (ffirst (d/q q db))))
;; => com.cognitect.transit.impl.URIImpl

(let [q '[:find ?url
          :where [?e :test/url ?url]]
      db (d/db conn)]
  (.getHost (ffirst (d/q q db))))
;; => Unhandled java.lang.IllegalArgumentException
;;    No matching field found: getHost for class com.cognitect.transit.impl.URIImpl

我期待作为类型。java.net.URI

更新:Datomic Support 的 Jaret Binford 澄清说,这是 Datomic 端的一个潜在错误。一旦得到进一步的澄清,我将更新这个问题。

更新:来自 Datomic Support 的 Jaret Binford 确认这是 Datomic 端的一个错误。

Clojure Datomic

评论

0赞 Jared Smith 10/3/2023
依赖动态语言中的具体类型可能会带来麻烦......一般来说,更好的问题是“这个东西是否具有我所期望的模式?”或者“这个东西是否响应了这个消息?”
0赞 pete23 10/5/2023
@JaredSmith根据问题,看起来问题是假 URI 没有实现 getHost。

答: 暂无答案