我从一个producer应用程序接收一个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());
}
下面是error:-
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
我要把杰森救回来。有办法解决这个问题吗?谢谢您。
note:- i 我用它来抽象marklogic的spring数据https://github.com/malteseduck/spring-data-marklogic
1条答案
按热度按时间tjjdgumg1#
新的marklogic开发人员的一个常见问题是,当“低级”接口更合适时,使用高级接口。在本例中,SpringAPI公开了基于spring实体的操作——如果您从spring实体开始就可以工作,但是您没有。你有“纯json”——也就是“文本”。在这种情况下,您不想将它们转换为实体,只是为了将它们存储在marklogic中——尽管是一个高级API,但有时也可以尝试单步执行——将字符串json转换为实体然后再转换回字符串以发送到ml所涉及的工作量是令人费解的。不仅仅是wrt性能,还有数据保真度。java到json不是1:1无损或明确的。如果您从一个实体开始,那么api是有意义的,但是您不想将真正的json转换成一个实体来写出来。
相反,请寻找其他API之一。例如,executewithclient将允许您访问下一个“较低”的api。在那里,您可以以json(文本)的形式编写json,而无需太多麻烦。使用databaseclient接口,您仍然需要选择一系列抽象——所有这些抽象仍然需要您将非常好的json文本转换为某种形式的对象,以便api可以将其转换回文本。
对于documentmanager(databaseclient的一部分),您需要一个writehandle——stringwritehandle应该适用于此。
一种更直接(更有效)的方法是通过xqueryexec执行文档插入。这个项目有一些例子:
https://github.com/daldei/mlperf
一个例子:(kotlin源代码)
如果性能对这个应用程序很重要,我建议尝试不同的方法。性能可能会有巨大的变化(100倍或更多),在api和方法的选择上似乎有细微的差别。上面的例子来自一个小程序,它使用不同的api写出大量的小json文件。在代码量大致相同的情况下,性能可以从5个文档/秒到2000个文档/秒不等。