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

Java 使用MarkLogic的Spring数据抽象在MarkLogic中保存JSON Obj时出错,java,json,apache-kafka,spring-data,marklogic,Java,Json,Apache Kafka,Spring Data,Marklogic,我正在从生产者应用程序接收一个JSON,当我试图将其转换为JSON对象并将其保存到MarkLogic中作为.JSON。我没有POJO来为传入的未知数据提供一个字段来用@Id对其进行注释。我得到了下面的错误 @Autowired MarkLogicOperations ops; @StreamListener(MultiInputSink.INPUT) public synchronized void handle(String ConsumerContents) {

我正在从生产者应用程序接收一个JSON,当我试图将其转换为JSON对象并将其保存到MarkLogic中作为
.JSON
。我没有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
我需要保存JSON。有办法解决这个问题吗?多谢各位


注意:-我将此用于MarkLogic的Spring数据抽象

新MarkLogic开发人员的一个常见问题是在“低级”接口更合适时使用高级接口。 在本例中,SpringAPI公开了基于spring实体的操作——如果您一开始就有spring实体,那么它可以正常工作,但是您没有。您有“纯json”——也就是“文本”。在这种情况下,您不希望仅为了将它们存储在MarkLogic中而将它们转换为实体——有时尝试单步执行某个高级API——将字符串JSON转换为实体然后再转换回字符串以发送到ML所涉及的工作量是Mindbogeling。不仅是wrt性能,还包括数据保真度。Java到JSON不是1:1无损或明确的。如果您从一个实体开始,那么API是有意义的,但是您不想将真正的JSON转换为一个实体,只是为了将其写出来

而是寻找其他API之一。例如,executeWithClient将允许您访问下一个“较低”的API。 从那里,您可以将JSON写为JSON(文本),而无需太多麻烦。 使用DatabaseClient接口,您仍然需要选择一系列抽象——所有这些都需要您将完美的JSON文本转换为某种形式的对象,以便API可以将其转换回文本

对于DocumentManager(DatabaseClient的一部分),您需要一个WriteHandle——StringWriteHandle应该适用于此

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

一个例子:(kotlin来源)

如果性能对这个应用程序很重要,我建议尝试不同的方法。性能可能会发生巨大的变化(100倍或更多),API和方法的选择似乎略有不同。上面的示例来自一个小程序,该程序使用不同的API写出大量的小JSON文件。在代码量大致相同的情况下,性能可以从每秒5个文档到每秒2000个文档不等

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)
}