使用 MarkLogic 的 Spring 数据抽象在 MarkLogic 中保存 JSON Obj 时出错

Error when Saving JSON Obj in MarkLogic using Spring data abstraction for MarkLogic

我从生产者应用程序收到 JSON,当我尝试将其转换为 JSON 对象并将其作为 .json 保存到 MarkLogic 中时。我没有用于传入未知数据的 POJO,无法使用 @Id 对其进行注释。我低于错误

@Autowired
MarkLogicOperations ops;

    @StreamListener(MultiInputSink.INPUT)
        public synchronized void handle(String ConsumerContents) {    


            JSONObject jsobObj = new JSONObject(consumerContents);

            ops.write(jsobObj, "Consumer");

            logger.info("Consumer Data "+jsobObj.toString());


        }

错误如下:-

nested exception is java.lang.illegalArgumentException: your entity of type org.json.JSONObject does not have a method or field annotated with field org.springframework.data.annotated.id

我需要保存 JSONs。有办法解决这个问题吗?谢谢。

注意:- 我将其用于 Spring-MarkLogic https://github.com/malteseduck/spring-data-marklogic

的数据抽象

新 marklogic 开发人员的一个常见问题是使用高级接口,而 'low' 级别更合适。 在这种情况下,spring API 公开了基于 spring 实体的操作——如果您有 spring 个实体开始,那么它会工作正常,但您没有。您有 'plain json' -- 又名 'text'。在这种情况下,您不想将它们转换为实体只是为了将它们存储在 MarkLogic 中——有时尝试通过高级 APIs 之一进行单步执行——从字符串 [=] 翻译所涉及的工作量41=] 到实体然后返回字符串发送到 ML 是令人难以置信的。不仅仅是性能,还有数据保真度。 Java 到 JSON 不是 1:1 无损或明确的。如果您 开始使用一个实体,那么API 是有道理的,但您不想将您的真实JSON 转换为实体只是为了将其写回.

而是寻找其他 API 之一。例如 executeWithClient 将使您可以访问下一个 'lower' API。 从那里你可以把 JSON 写成 JSON (文本)而不用大惊小怪。 使用 DatabaseClient 接口,您仍然必须在一系列抽象中进行选择——所有这些仍然需要您将完美的 JSON 文本转换为某种形式的对象,以便 API 可以将其转换回来发短信。

对于 DocumentManager(DatabaseClient 的一部分),您需要一个 WriteHandle -- StringWriteHandle 应该可以 用于此。

更直接(和有效)的方法是通过 xquery exec 执行文档插入。这个项目有一些例子:

https://github.com/DALDEI/mlperf

一个示例:(kotlin 源代码)

val repo = client.newServerEval()
repo.addVariable("url", getURI("evalstring", id))
repo.addVariable("content", (str))
repo.xquery(
    "declare variable  $url as xs:string external ;"+
          "declare variable ${'$'}content external ;"+
          "xdmp:document-insert( $url , xdmp:unquote( $content ) )"
)

repo.eval().forEach {
  println(it.string)
}

如果性能对此应用很重要,我建议尝试不同的方法。性能可能会有很大差异(相差 100 倍或更多),在 API 和方法的选择上似乎存在微小差异。上面的例子来自一个小程序,它练习不同的 APIs 写出大量的小 JSON 文件。使用大致相同的代码量,性能可能从 5 docs/sec 到 2000 docs/sec 不等。