MarkLogic:将 Map-Object 从 Java 传递给 XQuery

MarkLogic: pass Map-Object from Java to XQuery

我想通过 MarkLogic Java API 将一个简单的 Java Map<String, String> 传递给 XQuery 脚本。该脚本已经部署到服务器上的 /ext 目录并启动如下:

xquery version "1.0-ml";

declare variable $dr as xs:string external;
declare variable $en as xs:string external;
declare variable $fi as map:map external;
...

我正在使用 MarkLogic 网站上描述的模式:https://docs.marklogic.com/guide/java/resourceservices#id_70532 ("Basic Steps for Module Invocation")。

我的 Java 代码如下所示:

Map<String, String> map = new HashMap<>();
map.put("key1", "value1");
map.put("key2", "value2");

ServerEvaluationCall invoker = client.newServerEval();
invoker.addVariable("dr", "foo");
invoker.addVariable("en", "bar");
invoker.addVariableAs("fi", map);
String response = invoker.evalAs(String.class);

失败并出现以下异常:

java.lang.IllegalArgumentException: No factory for class java.util.HashMap
    at com.marklogic.client.impl.HandleFactoryRegistryImpl.makeHandle(HandleFactoryRegistryImpl.java:98) ~[marklogic-client-api-4.0.3.jar:?]
    at com.marklogic.client.impl.ServerEvaluationCallImpl.addVariableAs(ServerEvaluationCallImpl.java:123) ~[marklogic-client-api-4.0.3.jar:?]

我认为我需要在将地图发送到 ML 之前对其进行转换,或者可能使用其中一个处理程序 类,但我无法解决它或找到任何相关示例。有人做过吗?

将 Jackson JSON 对象传递给 XQuery 外部变量应该可行。 XQuery 中的值应该是 XQuery 映射或 JSON 节点。如果是 JSON 节点,xdmp:from-json() 函数可以将值转换为 XQuery 映射。

对于 Java 部分,查找作为 "the following code uses a Jackson object mapper to set an external variable value to a JSON object":

引入的示例

https://docs.marklogic.com/guide/java/resourceservices#id_21827

希望对您有所帮助,