使用 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 执行文档插入。这个项目有一些例子:
一个示例:(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 不等。
我从生产者应用程序收到 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 执行文档插入。这个项目有一些例子:
一个示例:(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 不等。